【三思筆記】 全面學習Oracle分區表及分區索引

[三思筆記]全面學習Oracle分區表及分區索引html

2008-04-15web

關於分區表和分區索引(About PartitionedTables and Indexes)面試

對於 10gR2 而言,基本上能夠分紅幾類:sql

v  Range(範圍)分區數據庫

v  Hash(哈希)分區微信

v  List(列表)分區網絡

v  以及組合分區:Range-Hash,Range-Listoracle

對於表而言(常規意義上的堆組織表),上述分區形式均可以應用(甚至能夠對某個分區指定 compress 屬性),只不過度區依賴列不能是 lob,long 之類數據類型,每一個表的分區或子分區數的總數不能超過 1024K-1 個。less

對於索引組織表,只可以支持普通分區方式,不支持組合分區,常規表的限制對於索引組織表一樣有效,除此以外呢,還有一些其實的限制,好比要求索引組織表的分區依賴列必須是主鍵才能夠等。ide

注:本篇全部示例僅針對常規表,即堆組織表!

對於索引,須要區分建立的是全局索引,或本地索引:

l   全局索引(global index):便可以分區,也能夠不分區。便可以建 range 分區,也能夠建 hash 分區,便可建於分區表,又可建立於非分區表上,就是說,全局索引是徹底獨立的,所以它也須要咱們更多的維護操做。

l   本地索引(local index):其分區形式與表的分區徹底相同,依賴列相同,存儲屬性也相同。對於本地索引,其索引分區的維護自動進行,就是說你 add/drop/split/truncate 表的分區時,本地索引會自動維護其索引分區。

Oracle 建議若是單個表超過 2G 就最好對其進行分區,對於大表建立分區的好處是顯而易見的,這裏很少論述 why,而將重點放在 when 以及 how

WHEN

1、When 使用 Range 分區

Range 分區呢是應用範圍比較廣的表分區方式,它是以列的值的範圍來作爲分區的劃分條件,將記錄存放到列值所在的 range 分區中,好比按照時間劃分,2008 1 季度的數據放到 a 分區,08 2 季度的數據放到 b 分區,所以在建立的時候呢,須要你指定基於的列,以及分區的範圍值,若是某些記錄暫沒法預測範圍,能夠建立 maxvalue 分區,全部不在指定範圍內的記錄都會被存儲到 maxvalue 所在分區中,而且支持指定多列作爲依賴列,後面在講 how 的時候會詳細談到。

2、When 使用 Hash 分區

一般呢,對於那些沒法有效劃分範圍的表,可使用 hash 分區,這樣對於提升性能仍是會有必定的幫助。 hash 分區會將表中的數據平均分配到你指定的幾個分區中,列所在分區是依據分區列的 hash 值自動分配,所以你並不能控制也不知道哪條記錄會被放到哪一個分區中,hash 分區也能夠支持多個依賴列。

3、When 使用 List 分區

List 分區與 range 分區和 hash 分區都有相似之處,該分區與 range 分區相似的是也須要你指定列的值,但這又不一樣與 range 分區的範圍式列值---其分區值必須明確指定,也不一樣與 hash 分區---經過明確指定分區值,你能控制記錄存儲在哪一個分區。它的分區列只能有一個,而不能像 range 或者 hash 分區那樣同時指定多個列作爲分區依賴列,不過呢,它的單個分區對應值能夠是多個。你在分區時必須肯定分區列可能存在的值,一旦插入的列值不在分區範圍內,則插入/更新就會失敗,所以一般建議使用list 分區時,要建立一個default 分區存儲那些不在指定範圍內的記錄,相似range 分區中的 maxvalue 分區。

4、When 使用組合分區

若是某表按照某列分區以後,仍然較大,或者是一些其它的需求,還能夠經過分區內再建子分區的方式將分區再分區,即組合分區的方式。

組合分區呢在 10g 中有兩種:range-hashrange-list。注意順序喲,根分區只能是 range 分區,子分區能夠是 hash 分區或 list 分區。

提示:11g 在組合分區功能這塊有所加強,又推出了 range-range,list-range,list-list,list-hash,這就至關於除 hash 外三種分區方式的笛卡爾形式都有了。爲何會沒有 hash 作爲根分區的組合分區形式呢,再仔細回味一下第二點,你必定可以想明白~~

HOW

1、如何建立

 
  clip_image002


若是想對某個表作分區,必須在建立表時就指定分區,咱們能夠對一個包含分區的表中的分區作修改,但不能直接將一個未分區的表修改爲分區表(起碼在 10g 是不行的,固然你可能會說,能夠經過在線重定義的方式,可是這不是直接喲,這也是藉助臨時表間接實現的)

建立表或索引的語法就不說了,你們確定比我還熟悉,而想在建表(索引)同時指定分區也很是容易,只須要把建立分區的子句放到";"前就行啦,同時須要注意表的 row movement 屬性,它用來控制是否容許修改列值所形成的記錄移動至其它分區存儲,有 enable|disable 兩種狀態,默認是 disable row movement,當 disable 時,若是記錄要被更新至其它分區,則更新語句會報錯。

下面分別演示不一樣分區方式的表和索引的建立:

1、建立 range 分區

語法以下,圖:[range_partitioning.gif]

須要咱們指定的有:

l   column:分區依賴列(若是是多個,以逗號分隔);

l   partition:分區名稱;

l   values less than:後跟分區範圍值(若是依賴列有多個,範圍對應值也應是多個,中間以逗號分隔);

l   tablespace_clause:分區的存儲屬性,例如所在表空間等屬性(可爲空),默認繼承基表所在表空間的屬性。

   建立一個標準的 range 分區表:

JSSWEB> create table t_partition_range (id number,name varchar2(50))

2    partition by range(id)(

3    partition t_range_p1 values less than (10) tablespace tbspart01,

4    partition t_range_p2 values less than (20) tablespace tbspart02, 5partition t_range_p3 values less than (30) tablespace tbspart03,

6       partition t_range_pmax values less than (maxvalue) tablespace tbspart04

7       );

表已建立。

要查詢建立分區的信息,能夠經過查詢 user_part_tables,user_tab_partitions 兩個數據字典(索引分區、組織分區等信息也有對應的數據字典,後續示例會逐步說起)。 user_part_tables:記錄分區的表的信息; user_tab_partitions:記錄表的分區的信息。

例如:

JSSWEB> select table_name,partitioning_type,partition_count

2              From user_part_tables where table_name='T_PARTITION_RANGE';

TABLE_NAME                                     PARTITI PARTITION_COUNT

------------------------------ ------- ---------------

T_PARTITION_RANGE                         RANGE                              4

JSSWEB> select partition_name,high_value,tablespace_name

2      from user_tab_partitions where table_name='T_PARTITION_RANGE' 3order by partition_position;

PARTITION_NAME                              HIGH_VALUE TABLESPACE_NAME

------------------------------ ---------- --------------------

T_RANGE_P1                                     10                TBSPART01

T_RANGE_P2                                     20                TBSPART02

T_RANGE_P3                                     30                TBSPART03

T_RANGE_PMAX                                  MAXVALUE     TBSPART04

   建立 global 索引 range 分區:

JSSWEB> create index idx_parti_range_id on t_partition_range(id)

2              global partition by range(id)(

3              partition i_range_p1 values less than (10) tablespace tbspart01,

4              partition i_range_p2 values less than (40) tablespace tbspart02,

5              partition i_range_pmax values less than (maxvalue) tablespace tbspart03);

索引已建立。

由上例能夠看出,建立 global 索引的分區與建立表的分區語句格式徹底相同,並且其分區形式與索引

所在表的分區形式沒有關聯關係。

注意:咱們這裏藉助上面的表 t_partition_range 來演示建立 range 分區的 global 索引,並不表示 range

分區的表,只能建立 range 分區的 global 索引,只要你想,也能夠爲其建立 hash 分區的 global 索引。

查詢索引的分區信息能夠經過 user_part_indexesuser_ind_partitions 兩個數據字典:

JSSWEB> select index_name, partitioning_type, partition_count

2              From user_part_indexes

3              where index_name = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                                     PARTITI PARTITION_COUNT

------------------------------ ------- ---------------

IDX_PARTI_RANGE_ID                       RANGE                              3

JSSWEB> select partition_name, high_value, tablespace_name

2              from user_ind_partitions

3              where index_name = 'IDX_PARTI_RANGE_ID'

4              order by partition_position;

PARTITION_NAME                              HIGH_VALUE TABLESPACE_NAME

------------------------------ ---------- --------------------

I_RANGE_P1                                     10                TBSPART01

I_RANGE_P2                                     40                TBSPART02

I_RANGE_PMAX                                  MAXVALUE     TBSPART03

   Local 分區索引的建立最簡單,例如:仍然藉助 t_partition_range 表來建立索引

--首先刪除以前建立的 global 索引

JSSWEB> drop index IDX_PARTI_RANGE_ID;

索引已刪除。

JSSWEB> create index IDX_PARTI_RANGE_ID on T_PARTITION_RANGE(id) local;

索引已建立。

查詢相關數據字典:

JSSWEB> select index_name, partitioning_type, partition_count

2              From user_part_indexes

3              where index_name = 'IDX_PARTI_RANGE_ID';

INDEX_NAME                                     PARTITI PARTITION_COUNT

------------------------------ ------- ---------------

IDX_PARTI_RANGE_ID                       RANGE                              4

JSSWEB> select partition_name, high_value, tablespace_name

2              from user_ind_partitions

3              where index_name = 'IDX_PARTI_RANGE_ID'

4              order by partition_position;

PARTITION_NAME                              HIGH_VALUE TABLESPACE_NAME

------------------------------ ---------- --------------------

T_RANGE_P1                                     10                TBSPART01

T_RANGE_P2                                     20                TBSPART02

T_RANGE_P3       30    TBSPART03 T_RANGE_PMAX  MAXVALUE  TBSPART04

能夠看出,local 索引的分區徹底繼承表的分區的屬性,包括分區類型,分區的範圍值即不需指定也不

能更改,這就是前面說的:local 索引的分區維護徹底依賴於其索引所在表。

不過呢分區名稱,以及分區所在表空間等信息是能夠自定義的,例如:

SQL> create index IDX_PART_RANGE_ID ON T_PARTITION_RANGE(id) local (

2       partition i_range_p1 tablespace tbspart01,

3       partition i_range_p2 tablespace tbspart01,

4       partition i_range_p3 tablespace tbspart02,

5       partition i_range_pmax tablespace tbspart02 6    );

索引已建立。

SQL> select index_name, partitioning_type, partition_count

2           From user_part_indexes

3           where index_name = 'IDX_PART_RANGE_ID';

INDEX_NAME                                 PARTITI PARTITION_COUNT

------------------------------ ------- ---------------

IDX_PART_RANGE_ID                     RANGE                              4

SQL> select partition_name, high_value, tablespace_name

2           from user_ind_partitions

3           where index_name = 'IDX_PART_RANGE_ID'

4           order by partition_position;

PARTITION_NAME    HIGH_VALUE          TABLESPACE_NAME

--------------- --------------- --------------------

I_RANGE_P1           10                         TBSPART01

I_RANGE_P2           20                         TBSPART01

I_RANGE_P3           30                         TBSPART02

I_RANGE_PMAX       MAXVALUE              TBSPART02

二、建立 hash 分區

語法以下:[:hash_partitioning.gif]

clip_image003

語法看起來比 range 複雜,其實使用起來比 range 更簡單,這裏須要咱們指定的有:

l  column:分區依賴列(支持多個,中間以逗號分隔);

l  partition:指定分區,有兩種方式:

n 直接指定分區名,分區所在表空間等信息 n 只指定分區數量,和可供使用的表空間。

建立 hash 分區表

JSSWEB> create table t_partition_hash (id number,name varchar2(50))

2       partition by hash(id)(

3       partition t_hash_p1 tablespace tbspart01,

4       partition t_hash_p2 tablespace tbspart02,

5       partition t_hash_p3 tablespace tbspart03);

表已建立。

要實現一樣效果,你還能夠這樣:

JSSWEB> create table t_partition_hash2 (id number,name varchar2(50))

2       partition by hash(id)

3       partitions 3 store in(tbspart01,tbspart02,tbspart03);

表已建立。

這就是上面說的,直接指定分區數量和可供使用的表空間。

提示:這裏分區數量和可供使用的表空間數量之間沒有直接對應關係。分區數並不必定要等於表空間數。

要查詢表的分區信息,仍然是經過 user_part_tables,user_tab_partitions 兩個數據字典,這裏再也不舉例。

Global 索引 hash 分區

Hash 分區索引的子句與 hash 分區表的建立子句徹底相同,例如:

JSSWEB> create index idx_part_hash_id on t_partition_hash(id)

2       global partition by hash(id)

3       partitions 3 store in(tbspart01,tbspart02,tbspart03);

索引已建立。

 
  clip_image005


查詢索引的分區信息也還是經過 user_part_indexesuser_ind_partitions 兩個數據字典,再也不舉例。

建立 Local 索引

在前面學習 range 分區時,咱們已經對 Local 索引的特性作了很是清晰的概述,所以這裏也再也不舉例,若有疑問,建議再仔細複習 range 分區的相關示例,若是還有疑問,當面問我好了:)

綜上:

Ø對於 global 索引分區而言,在 10g 中只能支持 range 分區和 hash 分區,所以後續示例中不會再說起。

Ø對於 local 索引分區而言,其分區形式徹底依賴於索引所在表的分區形式,無論從建立語法仍是理解難度均無技術含量,所以後續也再也不提供示例。

Ø注意,在建立索引時若是不顯式指定 global local,則默認是 global

Ø注意,在建立 global 索引時若是不顯式指定分區子句,則默認不分區(廢話)

三、建立 list 分區

建立語法以下:[圖:list_partitioning.gif]

須要咱們指定的有:

l   column:分區依賴列,注意:只能是一個;

l   partition:分區名稱;

l   literal:分區對應值,注意:每一個分區能夠對應多個值;

l   tablespace_clause:分區的存儲屬性,例如所在表空間等屬性(可爲空),默認繼承基表所在表空間的屬性。

建立 list 分區表示例:

JSSWEB> create table t_partition_list (id number,name varchar2(50))

2       partition by list(id)(

3       partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace tbspart01,

4       partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace tbspart02,

5       partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace tbspart03, 6 partition t_list_pd values (default) tablespace tbspart04);

表已建立。

上例可以實現與前面 range 分區示例相同的效果,固然針對本示例而言,list 分區顯然很差用啊~~~

四、建立 range-hash 組合分區

語法以下:圖[composite_partitioning.gif]

clip_image006

須要咱們指定的有:

l  column_list:分區依賴列(支持多個,中間以逗號分隔);

l  subpartition:子分區方式,有兩處:

n  Subpartition_by_list:語法與 list 分區徹底相同,只不過把關鍵字 partition 換成 subpartition

n  Subpartition_by_hash:語法與 hash 分區徹底相同,只不過把關鍵字 partition 換成 subpartition

l   partition:分區名稱;

l   range_partition_values_clause:range 分區範圍值的語法;

l   tablespace_clause:分區的存儲屬性,例如所在表空間等屬性(可爲空),默認繼承基表所在表空間的屬性。

組合分區相對於普通分區,語法上稍稍複雜了一些,但也正因如此,其子分區的建立能夠很是靈活,

下面分別舉幾個例子(注:僅示例,並不是窮舉全部形式)

   爲全部分區各建立 4 hash 子分區

 

JSSWEB> create table t_partition_rh (id number,name varchar2(50))

2       partition by range(id) subpartition by hash(name)

3       subpartitions 4 store in (tbspart01, tbspart02, tbspart03,tbspart04)(

4       partition t_r_p1 values less than (10) tablespace tbspart01,

5       partition t_r_p2 values less than (20) tablespace tbspart02,

6       partition t_r_p3 values less than (30) tablespace tbspart03,

7       partition t_r_pd values less than (maxvalue) tablespace tbspart04);

表已建立。

JSSWEB> select partitioning_type,subpartitioning_type,partition_count,def_subpartition_count

              2   From user_part_tables where table_name='T_PARTITION_RH';

PARTITI SUBPART PARTITION_COUNT DEF_SUBPARTITION_COUNT

------- ------- --------------- ----------------------

         RANGE     HASH                                4                                       4

JSSWEB> select partition_name,subpartition_count,high_value

              2   from user_tab_partitions where table_name='T_PARTITION_RH';

         PARTITION_NAME    SUBPARTITION_COUNT HIGH_VALUE

--------------- ------------------ ----------

          T_R_P2                                               4 20

          T_R_P3                                               4 30

         T_R_PD                                               4 MAXVALUE

          T_R_P1                                               4 10

JSSWEB> select partition_name,subpartition_name,tablespace_name

              2   from user_tab_subpartitions where table_name='T_PARTITION_RH';

         PARTITION_NAME    SUBPARTITION_NAME                        TABLESPACE_NAME

--------------- ------------------------------ --------------------

          T_R_P2                 SYS_SUBP140                                   TBSPART02

          T_R_P2                 SYS_SUBP139                                   TBSPART02

          T_R_P2                 SYS_SUBP138                                   TBSPART02

          T_R_P2                 SYS_SUBP137                                   TBSPART02

          T_R_P3                 SYS_SUBP144                                   TBSPART03

          T_R_P3                 SYS_SUBP143                                   TBSPART03

          T_R_P3                 SYS_SUBP142                                   TBSPART03

          T_R_P3                 SYS_SUBP141                                   TBSPART03

         T_R_PD                  SYS_SUBP148                                   TBSPART04

         T_R_PD                  SYS_SUBP147                                   TBSPART04

         T_R_PD                  SYS_SUBP146                                   TBSPART04

         T_R_PD                  SYS_SUBP145                                   TBSPART04

T_R_P1

SYS_SUBP133

TBSPART01

T_R_P1

SYS_SUBP136

TBSPART01

T_R_P1

SYS_SUBP135

TBSPART01

T_R_P1

已選擇 16 行。

SYS_SUBP134

TBSPART01

這裏咱們要學到一個新的數據字典:user_tab_subpartitions,用於查詢表的子分區信息。

   對某個分區建立 hash 子分區

JSSWEB> create table t_partition_rh (id number,name varchar2(50))

2           partition by range(id) subpartition by hash(name)(

3           partition t_r_p1 values less than (10) tablespace tbspart01,

4           partition t_r_p2 values less than (20) tablespace tbspart02,

5           partition t_r_p3 values less than (30) tablespace tbspart03

6           (subpartition t_r_p3_h1 tablespace tbspart01,

7           subpartition t_r_p3_h2 tablespace tbspart02,

8           subpartition t_r_p3_h3 tablespace tbspart03),

9           partition t_r_pd values less than (maxvalue) tablespace tbspart04);

表已建立。

JSSWEB> select partitioning_type,subpartitioning_type,partition_count,def_subpartition_count

2       From user_part_tables where table_name='T_PARTITION_RH';

PARTITI SUBPART PARTITION_COUNT DEF_SUBPARTITION_COUNT

------- ------- --------------- ----------------------

RANGE      HASH                                4                                       1

JSSWEB> select partition_name,subpartition_count,high_value

2       from user_tab_partitions where table_name='T_PARTITION_RH';

PARTITION_NAME    SUBPARTITION_COUNT HIGH_VALUE

--------------- ------------------ ----------

T_R_P1                                               1 10

T_R_P2                                               1 20

T_R_P3                                               3 30

T_R_PD                                                1 MAXVALUE

JSSWEB> select partition_name,subpartition_name,tablespace_name

2       from user_tab_subpartitions where table_name='T_PARTITION_RH';

PARTITION_NAME    SUBPARTITION_NAME                         TABLESPACE_NAME

--------------- ------------------------------ --------------------


T_R_P1

SYS_SUBP149

TBSPART01

T_R_P2

SYS_SUBP150

TBSPART02

T_R_P3

T_R_P3_H3

TBSPART03

T_R_P3

T_R_P3_H2

TBSPART02

T_R_P3

T_R_P3_H1

TBSPART01

T_R_PD

已選擇 6 行。

SYS_SUBP151

TBSPART04

固然,還能夠給各個分區指定不一樣的子分區

JSSWEB> create table t_partition_rh (id number,name varchar2(50))

2              partition by range(id) subpartition by hash(name)(

3              partition t_r_p1 values less than (10) tablespace tbspart01,

4              partition t_r_p2 values less than (20) tablespace tbspart02

5              (subpartition t_r_p2_h1 tablespace tbspart01,

6              subpartition t_r_p2_h2 tablespace tbspart02),

7              partition t_r_p3 values less than (30) tablespace tbspart03

8              subpartitions 3 store in (tbspart01,tbspart02,tbspart03),

9              partition t_r_pd values less than (maxvalue) tablespace tbspart04

10          (subpartition t_r_p3_h1 tablespace tbspart01,

11          subpartition t_r_p3_h2 tablespace tbspart02,

12          subpartition t_r_p3_h3 tablespace tbspart03) 13       );

表已建立。

JSSWEB> select partitioning_type,subpartitioning_type,partition_count,def_subpartition_count

2     From user_part_tables where table_name='T_PARTITION_RH';

PARTITI SUBPART PARTITION_COUNT DEF_SUBPARTITION_COUNT

------- ------- --------------- ----------------------

RANGE    HASH                                4                                       1

JSSWEB> select partition_name,subpartition_count,high_value

2     from user_tab_partitions where table_name='T_PARTITION_RH';

PARTITION_NAME  SUBPARTITION_COUNT HIGH_VALUE

--------------- ------------------ ----------

T_R_P1                                              1 10

          T_R_P2                                               2 20

          T_R_P3                                               3 30

         T_R_PD                                               3 MAXVALUE

JSSWEB> select partition_name,subpartition_name,tablespace_name

2       from user_tab_subpartitions where table_name='T_PARTITION_RH';

PARTITION_NAME    SUBPARTITION_NAME                        TABLESPACE_NAME

--------------- ------------------------------ --------------------

T_R_P1                  SYS_SUBP152                                   TBSPART01

T_R_P2                  T_R_P2_H2                                      TBSPART02

T_R_P2                  T_R_P2_H1                                      TBSPART01

T_R_P3                  SYS_SUBP155                                   TBSPART03

T_R_P3                  SYS_SUBP154                                   TBSPART02

T_R_P3                  SYS_SUBP153                                   TBSPART01

T_R_PD                  T_R_P3_H3                                      TBSPART03

T_R_PD                  T_R_P3_H2                                      TBSPART02

T_R_PD                  T_R_P3_H1                                      TBSPART01

已選擇 9 行。

提示:由上兩例能夠看出,未顯式指定子分區的分區,系統會自動建立一個子分區。

分區模板的應用

oracle 還提供了一種稱爲分區模板的功能,在指定子分區信賴列以後,制訂子分區的存儲模板,各個

分區即會按照子分區模式建立子分區,例如:

JSSWEB> create table t_partition_rh (id number,name varchar2(50))

2           partition by range(id) subpartition by hash(name)

3           subpartition template (

4           subpartition h1 tablespace tbspart01,

5           subpartition h2 tablespace tbspart02,

6           subpartition h3 tablespace tbspart03,

7           subpartition h4 tablespace tbspart04)(

8           partition t_r_p1 values less than (10) tablespace tbspart01,

9           partition t_r_p2 values less than (20) tablespace tbspart02,

10       partition t_r_p3 values less than (30) tablespace tbspart03,

11       partition t_r_pd values less than (maxvalue) tablespace tbspart04);

表已建立。

JSSWEB> select partition_name,subpartition_name,tablespace_name

2   from user_tab_subpartitions where table_name='T_PARTITION_RH';

PARTITION_NAMESUBPARTITION_NAME                        TABLESPACE_NAME

 

--------------- ------------------------------ --------------------

 

 

 

T_R_P1                  T_R_P1_H4

TBSPART01

 

 

T_R_P1                  T_R_P1_H3

TBSPART01

 

 

T_R_P1                  T_R_P1_H2

TBSPART01

 

 

T_R_P1                  T_R_P1_H1

TBSPART01

 

T_R_P2

T_R_P2_H4

TBSPART02

T_R_P2

T_R_P2_H3

TBSPART02

T_R_P2

T_R_P2_H2

TBSPART02

T_R_P2

T_R_P2_H1

TBSPART02

T_R_P3

T_R_P3_H4

TBSPART03

T_R_P3

T_R_P3_H3

TBSPART03

T_R_P3

T_R_P3_H2

TBSPART03

T_R_P3

T_R_P3_H1

TBSPART03

T_R_PD

T_R_PD_H4

TBSPART04

T_R_PD

T_R_PD_H3

TBSPART04

T_R_PD

T_R_PD_H2

TBSPART04

T_R_PD

已選擇 16 行。

T_R_PD_H1

TBSPART04

         

五、建立 range-list 組合分區

Range-list 組合分區的建立與 range-hash 極爲類似,只是子分區爲 list 分區,固然一樣也能夠應用分區

模板,下面也舉一個示例:

JSSWEB> create table t_partition_rl (id number,name varchar2(50))

2           partition by range(id) subpartition by list(name)

3           subpartition template (

4           subpartition l1 values ('aa') tablespace tbspart01,

5           subpartition l2 values ('bb') tablespace tbspart02,

6           subpartition l3 values ('cc') tablespace tbspart03,

7           subpartition l4 values ('dd') tablespace tbspart04)(

8           partition t_r_p1 values less than (10) tablespace tbspart01,

9           partition t_r_p2 values less than (20) tablespace tbspart02,

10       partition t_r_p3 values less than (30) tablespace tbspart03,

11       partition t_r_pd values less than (maxvalue) tablespace tbspart04);

表已建立。

JSSWEB> select partition_name,subpartition_name,tablespace_name

2   from user_tab_subpartitions where table_name='T_PARTITION_RL';

PARTITION_NAMESUBPARTITION_NAME                        TABLESPACE_NAME

--------------- ------------------------------ --------------------

T_R_P1

T_R_P1_L4

TBSPART01

T_R_P1

T_R_P1_L3

TBSPART01

T_R_P1

T_R_P1_L2

TBSPART01

T_R_P1

T_R_P1_L1

TBSPART01

T_R_P2

T_R_P2_L4

TBSPART02


T_R_P2

T_R_P2_L3

TBSPART02

T_R_P2

T_R_P2_L2

TBSPART02

T_R_P2

T_R_P2_L1

TBSPART02

T_R_P3

T_R_P3_L4

TBSPART03

T_R_P3

T_R_P3_L3

TBSPART03

T_R_P3

T_R_P3_L2

TBSPART03

T_R_P3

T_R_P3_L1

TBSPART03

T_R_PD

T_R_PD_L4

TBSPART04

T_R_PD

T_R_PD_L3

TBSPART04

T_R_PD

T_R_PD_L2

TBSPART04

T_R_PD

已選擇 16 行。

T_R_PD_L1

TBSPART04

其它方式的建立對於 range-list 一樣好使,這裏再也不舉例,若有不明,請自學複習前章 range_hash 組合

分區。

對於複合分區的 local 索引,咱們也舉一個示例,查看其分區狀況:

SQL> create index idx_part_rl_id on t_partition_rl(id) local;

索引已建立。

又能夠學幾個數據字典:user_part_indexesuser_ind_partitions 前面已經認識了,user_ind_subpartitions 用來查詢索引的子分區信息。

SQL> select table_name,partitioning_type,

2                                partition_count,def_subpartition_count

3                                from user_part_indexes

4                                where index_name = 'IDX_PART_RL_ID';

TABLE_NAME                                     PARTITI PARTITION_COUNT DEF_SUBPARTITION_COUNT

------------------------------ ------- --------------- ----------------------

T_PARTITION_RL                              RANGE                              4                                       4

SQL> select partition_name, subpartition_count, high_value

2              from user_ind_partitions

3              where index_name = 'IDX_PART_RL_ID';

PARTITION_NAME    SUBPARTITION_COUNT HIGH_VALUE

--------------- ------------------ ---------------

T_R_P1                                                4 10

T_R_P2                                                4 20

T_R_P3                                                4 30

T_R_PD                                                4 MAXVALUE

SQL> select partition_name, subpartition_name, high_value, tablespace_name

2              from user_ind_subpartitions

3              where index_name = 'IDX_PART_RL_ID';

         PARTITION_NAME    SUBPARTITION_NAME                        HIGH_VALUE

TABLESPACE_NAME

--------------- ------------------------------ --------------- --------------------

          T_R_P1                 T_R_P1_L1                                       'aa'                     TBSPART01

T_R_P1  T_R_P1_L2    'bb'  TBSPART01 T_R_P1    T_R_P1_L3    'cc'   TBSPART01

T_R_P1  T_R_P1_L4    'dd'  TBSPART01 T_R_P2    T_R_P2_L1    'aa'   TBSPART02

T_R_P2  T_R_P2_L2    'bb'  TBSPART02 T_R_P2    T_R_P2_L3    'cc'   TBSPART02

T_R_P2  T_R_P2_L4    'dd'  TBSPART02 T_R_P3    T_R_P3_L1    'aa'   TBSPART03

T_R_P3  T_R_P3_L2    'bb'  TBSPART03 T_R_P3    T_R_P3_L3    'cc'   TBSPART03

          T_R_P3                 T_R_P3_L4                                       'dd'                     TBSPART03

         T_R_PD                  T_R_PD_L1                                       'aa'                     TBSPART04

T_R_PD  T_R_PD_L2   'bb'  TBSPART04 T_R_PD   T_R_PD_L3   'cc'   TBSPART04

         T_R_PD                  T_R_PD_L4                                       'dd'                     TBSPART04

已選擇 16 行。

仍是與表的分區格式同樣,無論是普通分區仍是複合分區,local 索引都沒啥自主權啊。

六、公共準則

一、         若是選擇的分區不能確保各分區內記錄量的基本平均,則這種分區方式有多是不恰當的。

好比對於 range 分區,假設分了 10 個分區,而其中一個分區中的記錄數佔總記錄數的 90%,其它 9 個分區只佔總記錄數的 10%,則這個分區方式就起不到數據平衡的做用。固然,若是你的目的並非爲了平衡,只是爲了區分數據,ok,對於這種狀況,我想說的是,你務必要意識到存在這個問題。

二、         對於分區的表或索引,其所涉及的全部分區,其塊大小必須一致。

最後,建議對於上面建立的表或建表腳本妥善保存並記憶,後面咱們須要頻繁用到,後續示例將均主要依賴前文中建立的表進行:)

2、如何管理

對於分區的表的操做不少,其中某些操做僅針對某些分區有效,爲了不在演示過程當中浪費過多口水標註哪些操做適用於哪些分區,我們先在這兒列個表,哪一個操做適用於哪一種分區格式具體能夠先參考下面這個表格:

分區表

Range

List

Hash

Range-Hash

Range-List

是否帶來IO操做

增長分區

(add partition)

支持

支持

支持

支持

支持

hash類型外,均不變帶來大量IO

收縮分區

(coalesce partitions)

/

/

支持

分區:/

子分區:支持

/

刪除分區

(drop partition)

支持

支持

/

分區:支持子分區:/

支持

交換分區

(exchange partition)

支持

支持

支持

支持

支持

合併分區

(merge partition)

支持

支持

/

分區:支持子分區:/

支持

修改默認屬性

(modify default attributes)

支持

支持

支持

支持

支持

修改分區當前屬性

(modify partition)

支持

支持

支持

支持

支持

List分區增長值

(modify partition add values)

/

支持

/

/

分區:/

子分區:支持

List分區刪除值

(modify partition drop values)

/

支持

/

/

分區:/

子分區:支持

單純刪除操做無,但可能爲了實現成功刪除,以前的準備操做會帶來必定量的IO

修改子分區模板

(set subpartition template)

/

/

/

支持

支持

移動分區

(move partition)

支持

支持

支持

分區:支持子分區:/

分區:支持子分區:/

重命名分區

(rename partition)

支持

支持

支持

支持

支持

拆分分區

(split partition)

支持

支持

/

分區:支持子分區:/

支持

截斷分區

(truncate partition)

支持

支持

支持

支持

支持

注:上述 IO 列的評估創建在假設分區中均存在必定量數據,並忽略修改數據字典可能觸發的 IO,忽略形成的索引的重編譯帶來的 IO

分區索引的操做也有一張表黑黑,以下:

分區索引

索引類型

Range

List

Hash

組合分區

是否帶來IO操做

增長分區

(add partition)

全局

/

/

支持

/

本地

/

/

/

/

 

刪除分區

(drop partition)

全局

支持

/

/

/

本地

/

/

/

/

 

修改默認屬性

(modify default attributes)

全局

支持

/

/

/

本地

支持

支持

支持

支持

修改分區當前屬性

全局

支持

/

/

/

(modify partition)

本地

支持

支持

支持

支持

重編譯分區

(rebuild partition)

全局

支持

/

/

/

本地

支持

支持

支持

支持

重命名分區

(rename partition)

全局

支持

/

/

/

本地

支持

支持

支持

支持

拆分分區

(split partition)

全局

支持

/

/

/

本地

/

/

/

/

 

另外 local 索引前頭咱們屢次提到了,其維護會在 oracle 操做表分區的時候自動進行,須要注意的是 global

索引,當 global 索引所在表執行 alter table 涉及下列操做時,會導至該索引失效:

Ø  ADD PARTITION | SUBPARTITION

Ø  COALESCE PARTITION | SUBPARTITION

Ø  DROP PARTITION | SUBPARTITION

Ø  EXCHANGE PARTITION | SUBPARTITION

Ø  MERGE PARTITION | SUBPARTITION

Ø  MOVE PARTITION | SUBPARTITION

Ø  SPLIT PARTITION | SUBPARTITION

Ø  TRUNCATE PARTITION | SUBPARTITION

所以,建議用戶在執行上述操做 sql 語句後附加 update indexes 子句,oracle 即會自動維護全局索引,固然,須要注意這中間有一個平衡,你要平衡操做 ddl 的時間和重建索引哪一個時間更少,以決定是否須要附加 update indexes 子句。

分區表的管理

1、增長表分區(add partition) 增長表分區適應於全部的分區形式,其語法是 alter table tbname add partition .....

可是,須要注意對於像 list,range 這種存在範圍值的分區,所要增長的分區值必需要大於當前分區中的最大值(若是當前存在 maxvalue default 的分區,add partition 會報錯,這種狀況只能使用 split,後面會講到),hash 分區則無此限制。

例如:

JSSWEB> create table t_partition_range (id number,name varchar2(50))

2           partition by range(id)(

3           partition t_range_p1 values less than (10) tablespace tbspart01,

4           partition t_range_p2 values less than (20) tablespace tbspart02,

5           partition t_range_p3 values less than (30) tablespace tbspart03

6           );

表已建立。

JSSWEB> alter table t_partition_range

2   add partition t_range_p4 values less than(40);

表已更改。

Hash list 的語法與上相似,這裏再也不舉例。

注意:

一、    對於 hash 分區,當你執行 add partition 操做的時候,oracle 會自動選擇一個分區,並從新分配部分記錄到新建的分區,這也意味着有可能帶來一些 IO 操做。

二、    執行 alter table 時未指定 update indexes 子句:若是是 range/list 分區,其 local 索引和 global 索引不會受影響;

若是是 hash 分區,新加分區及有數據移動的分區的 local 索引和 glocal 索引會被置爲 unuseable,須要從新編譯。

三、    複合分區徹底適用上述所述規則。

二、收縮表分區(coalesce partitions)

Coalesce partition 是個頗有意思的分區功能,僅能被應用於 hash 分區或複合分區的 hash 子分區,執行以後,會自動收縮當前的表分區,好比某表當前有 5 hash 分區,執行 alter table tbname coalesce partitions 後就變成 4 個,再執行一次就變成 3 個,再執行一次就變 2 個,再執行一次就...........就報錯了:),對於已分區的表至少要有一個分區存在的嘛!

例如:

JSSWEB> select table_name,partition_name from user_tab_partitions

2         where table_name='T_PARTITION_HASH';

TABLE_NAME                                     PARTITION_NAME

------------------------------ ------------------------------

T_PARTITION_HASH                          T_HASH_P2

T_PARTITION_HASH                          T_HASH_P3

T_PARTITION_HASH                          T_HASH_P4

T_PARTITION_HASH                          T_HASH_P5

T_PARTITION_HASH                          T_HASH_P1

JSSWEB> alter table t_partition_hash coalesce partition;

表已更改。

JSSWEB> select table_name,partition_name from user_tab_partitions

2         where table_name='T_PARTITION_HASH';

TABLE_NAME                                     PARTITION_NAME

------------------------------ ------------------------------

T_PARTITION_HASH                          T_HASH_P2

T_PARTITION_HASH                          T_HASH_P3

T_PARTITION_HASH                          T_HASH_P4

T_PARTITION_HASH  T_HASH_P1 注意,收縮的只是分區,並不會影響到數據,可是視被收縮分區中數據的多少,收縮表分區也會涉及

IO 操做。

另外若是你在執行該語句時沒有指定 update indexes 子句,收縮過程當中有數據改動的分區其 local 索引

glocal 索引都會失效,須要從新編譯。

三、刪除表分區(drop partition)

刪除表分區包含兩種操做,分別是:

Ø  刪除分區:alter table [tbname] drop partition [ptname];

Ø  刪除子分區:alter table [tbname] drop subpartition [ptname];

hash 分區和 hash 子分區外,其它的分區格式均可以支持這項操做。

例如,刪除分區:

JSSWEB> select table_name,partition_name

2       from user_tab_partitions where table_name='T_PARTITION_LIST';

TABLE_NAME                                     PARTITION_NAME

------------------------------ ------------------------------

T_PARTITION_LIST                          T_LIST_P1

T_PARTITION_LIST                          T_LIST_P2

T_PARTITION_LIST                          T_LIST_P3

T_PARTITION_LIST                          T_LIST_PD

JSSWEB> alter table t_partition_list drop partition t_list_p2;

表已更改。

提示,drop partition 時,該分區內存儲的數據也將同時刪除,例如:

JSSWEB> insert into t_partition_list values (1,'a');

..........

--插入一批記錄,分佈於當前各個分區

..........

JSSWEB> commit;

提交完成。

JSSWEB> select *from t_partition_list;

ID NAME

---------- --------------------------------------------------

1  a

2  b

21  a

22  b

--單獨查詢 t_list_p3 分區,當前有數據

JSSWEB> select *from t_partition_list partition(t_list_p3);

ID NAME

---------- --------------------------------------------------

21  a

22  b

--刪除 t_list_p3 分區,數據會被同時刪除

JSSWEB> alter table t_partition_list drop partition t_list_p3;

表已更改。

JSSWEB> select *from t_partition_list partition(t_list_p3);

select *from t_partition_list partition(t_list_p3)

*

1 行出現錯誤:

ORA-02149: 指定的分區不存在

JSSWEB> select *from t_partition_list;

ID NAME

---------- --------------------------------------------------

1  a

2  b

因爲是 ddl 操做,這種刪除也會是很是迅速的,所以若是你確認某個分區的數據都要被刪除,使用 drop partition 會比 delete 更加高效。若是你的本意是但願刪除掉指定的分區但保留數據,你應該使用 merge partition,後面也會講到。

一樣,若是你在執行該語句時沒有指定 update indexes 子句,也會致使 glocal 索引的失效,至於 local 索引嘛,刪除分區時對應的索引分區會被同時刪除,但其它分區的 local 索引不會受到影響。

4、交換表分區(Exchange Partitions)

直白的說就是遷移數據。遷移數據的方式不少,爲何要使用 exchange partition 的方式呢,表急,聽三思慢慢道來。

Exchange partition 提供了一種方式,讓你在表與表或分區與分區之間遷移數據,注意不是將錶轉換成分區或非分區的形式,而僅只是遷移表中數據(互相遷移),因爲其號稱是採用了更改數據字典的方式,所以效率最高(幾乎不涉及 io 操做)Exchange partition 適用於全部分區格式,你能夠將數據從分區表遷移到非分區表,也能夠從非分區表遷移至分區表,或者從 hash partition range partition 諸如此類吧。

其語法很簡單:alter table tbname1 exchange partition/subpartition ptname with table tbname2;

Exchange partition 遷移的方式也頗有意思,言語表達怕你們聽不明白,下面直接經過示例來表達:借用前文中建立的空分區表:t_partition_range,並插入幾條記錄

JSSWEB> create table t_partition_range (id number,name varchar2(50))

2    partition by range(id)(

3    partition t_range_p1 values less than (10) tablespace tbspart01,

4    partition t_range_p2 values less than (20) tablespace tbspart02, 5partition t_range_p3 values less than (30) tablespace tbspart03,

6           partition t_range_pmax values less than (maxvalue) tablespace tbspart04

7           );

表已建立。

JSSWEB> insert into t_partition_range values (11,'a');

已建立 1 行。

JSSWEB> insert into t_partition_range values (12,'b');

已建立 1 行。

JSSWEB> insert into t_partition_range values (13,'c');

已建立 1 行。

JSSWEB> commit;

提交完成。

再建立一個非分區表,結構與 t_partition_range 相同

JSSWEB> create table t_partition_range_tmp (id number,name varchar2(50));

表已建立。

執行交換分區(咱們知道剛插入到 range 分區表的數據都在分區 t_range_p2 中,所以這裏指定交換該分區)

JSSWEB> alter table t_partition_range exchange partition t_range_p2 2 with table t_partition_range_tmp;

表已更改。

看看效果如何:

JSSWEB> select * from t_partition_range partition(t_range_p2);

未選定行

JSSWEB> select * from t_partition_range_tmp;

ID NAME

---------- --------------------------------------------------

11  a

12  b

13  c

記錄成功交換到未分區的表中。

咱們再執行一次 exchange partition 的命令,看看又會發生什麼呢

JSSWEB> select *from t_partition_range partition(t_range_p2);

ID NAME

---------- --------------------------------------------------

11  a

12  b

13  c

JSSWEB> select *from t_partition_range_tmp;

未選定行

又交換回來了,有點兒意思。

再作個更加明確的測試,咱們往未分區的表中加入一些記錄後再執行 exchange partition,看看會發生什

麼呢:

JSSWEB> insert into t_partition_range_tmp values (15,'d');

已建立 1 行。

JSSWEB> insert into t_partition_range_tmp values (16,'e');

已建立 1 行。

JSSWEB> insert into t_partition_range_tmp values (17,'d');

已建立 1 行。

JSSWEB> alter table t_partition_range exchange partition t_range_p2 2 with table t_partition_range_tmp;

表已更改。

JSSWEB> select *from t_partition_range partition(t_range_p2);

ID NAME

---------- --------------------------------------------------

15  d

16  e

17  d

JSSWEB> select *from t_partition_range_tmp;

ID NAME

---------- --------------------------------------------------

11  a

12  b

13  c

這就是前面所說的,互相交換的意思~~

注意:

l  涉及交換的兩表之間表結構必須一致,除非附加 with validation 子句;

l  若是是從非分區表向分區表作交換,非分區表中的數據必須符合分區表中指定分區的規則,除非附加 without validation 子句;

l  若是從分區表向分區表作交換,被交換的分區的數據必須符合分區規則,除非附加 without validation 子句;

l  Global 索引或涉及到數據改動了的 global 索引分區會被置爲 unusable,除非附加 update indexes 子句。

提示:

一旦附加了 without validation 子句,則表示再也不驗證數據有效性,所以指定該子句時務必慎重。

例如:

JSSWEB> insert into t_partition_range_tmp values (8,'g');

已建立 1 行。

JSSWEB> alter table t_partition_range exchange partition t_range_p2 2 with table t_partition_range_tmp without validation;

表已更改。

JSSWEB> select *from t_partition_range partition(t_range_p2);

ID NAME

---------- --------------------------------------------------

11  a

12  b

13  c

8 g

雖然新插入的記錄並不符合 t_range_p2 分區的範圍值,但指定了 without validation 後,數據仍然轉換


成功。

5、合併表分區(Merge Partitions)

合併兩個分區成一個,適用於除 hash 以外的其它全部分區形式(hash 分區有 coalesce partition 的嘛,前頭剛剛講過)

語法很簡單:alter table tbname merge partitions/subpartitions pt1,pt2 into partition/subpartition pt3; 一樣也支持 update indexes 子句以免單獨執行形成索引失效的問題。

須要注意一點,要合併的兩個分區必須是連續的,這點是由分區自己的特性所決定的,如例:

JSSWEB> alter table t_partition_range merge partitions t_range_p1,t_range_p2 2 into partition t_range_pnew;

表已更改。

JSSWEB> select table_name,partition_name,high_value from user_tab_partitions

2       where table_name='T_PARTITION_RANGE';

TABLE_NAME                                     PARTITION_NAME                              HIGH_VALUE

------------------------------ ------------------------------ ----------------

T_PARTITION_RANGE                        T_RANGE_P3                                     30

T_PARTITION_RANGE                         T_RANGE_PMAX                                  MAXVALUE

T_PARTITION_RANGE                         T_RANGE_PNEW                                 20

JSSWEB> select *from t_partition_range partition(t_range_pnew);

ID NAME

---------- --------------------------------------------------

11  a

12  b

13  c

8 g

可見,合併分區操做不會形成數據丟失,另外若是你想爲新分區指定屬性的話,在語句末尾處增長存儲屬性便可(若是不指定,則新分區默認繼續表的存儲屬性)。例如:

JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions 2 where table_name='T_PARTITION_LIST';

PARTITION_NAME       HIGH_VALUE                                      TABLESPACE_NAME

--------------------              -------------------------------------------------- ---------------

T_LIST_P1    1, 2, 3, 4, 5, 6, 7, 8, 9, 10       TBSPART01 T_LIST_P2      11, 12, 13, 14, 15, 16, 17, 18, 19, 20    TBSPART02

T_LIST_P3                     21, 22, 23, 24, 25, 26, 27, 28, 29, 30         TBSPART03

         T_LIST_PD                     default                                                 TBSPART04

JSSWEB> alter table t_partition_list merge partitions t_list_p2,t_list_p3 2 into partition t_list_p2 tablespace tbspart02;

表已更改。

JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions 2  where table_name='T_PARTITION_LIST';

PARTITION_NAME     HIGH_VALUE                                                        TABLESPACE_NAME

--------------------            --------------------------------------------------                   ---------------

T_LIST_P1                     1, 2, 3, 4, 5, 6, 7, 8, 9, 10                                      TBSPART01

T_LIST_P2                     21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 11, 12, 13       TBSPART02

, 14, 15, 16, 17, 18, 19, 20

T_LIST_PD                     default                                                               TBSPART04

注意,merge 分區操做與 coalesce 分區操做同樣,視被合併的分區數據量多少,均可能涉及到大量的 IO 操做。

其它合併組合分區的操做與上相似,若是要合併組合分區,注意關鍵字是 merge subpartitions,這裏就

不作演示了。

6、修改 list 表分區--AddValues

從標題便可得知,此命令僅應用於 list 分區或 list 子分區,語法也很是簡單:

Alter table tbname modify partition/subpartition ptname add values (v1,v2....vn); 舉個例子:

JSSWEB> select partition_name,high_value from user_tab_partitions

2       where table_name='T_PARTITION_LIST';

PARTITION_NAME            HIGH_VALUE

-------------------- --------------------------------------------------

T_LIST_P1                     1, 2, 3, 4, 5, 6, 7, 8, 9, 10

T_LIST_P2                     21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 11, 12, 13

, 14, 15, 16, 17, 18, 19, 20

T_LIST_PD                     default

JSSWEB> alter table t_partition_list modify partition t_list_p1 add values (31,33);

表已更改。

JSSWEB> select partition_name,high_value from user_tab_partitions 2  where table_name='T_PARTITION_LIST';

         PARTITION_NAME            HIGH_VALUE

-------------------- --------------------------------------------------

          T_LIST_P1                     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 31, 33

          T_LIST_P2                     21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 11, 12, 13

 

, 14, 15, 16, 17, 18, 19, 20

T_LIST_PD

default

惟一的限制是注意要添加的新 value 值不能存在於當前任何分區中,而且當前表也不能存在記錄值爲新值的記錄,特別是當你建立了 default 分區的時候,有必要先檢查一下當前表不存在要添加的值,否則命令執行會出錯,例如:

JSSWEB> insert into t_partition_list values (32,'a');

已建立 1 行。

JSSWEB> alter table t_partition_list modify partition t_list_p1 add values (32); alter table t_partition_list modify partition t_list_p1 add values (32)

*

1 行出現錯誤:

ORA-14324: 所要添加的值已存在於 DEFAULT 分區之中

提示,增長新的列表值不會影響到表中原有的記錄,所以不會對索引形成影響。

7、修改 list 表分區--Drop Values

與上相似,也是隻能應用於 list 分區,不過功能相反,該命令是用來刪除指定分區的 value 值,語法如

下:

Alter table tbname modify partition/subpartition ptname drop values (v1,v2....vn);

一樣在刪除 list 分區 value 列值的時候,也必須確認當前分區存在指定的 value 值,可是沒有任何應用

該值的記錄,有點兒饒是吧,腦殼多轉幾圈就行了。

舉個例子:

JSSWEB> alter table t_partition_list modify partition t_list_p1 drop values (31);

表已更改。

成功執行了是吧,接着來看

JSSWEB> alter table t_partition_list modify partition t_list_p1 drop values (31); alter table t_partition_list modify partition t_list_p1 drop values (31)

*

1 行出現錯誤:

ORA-14313: 31 不在分區 T_LIST_P1

出錯了吧,這是其中的一種錯誤情形,即前面說的,要確保當前分區中存在指定的 value 值,再往下看

JSSWEB> alter table t_partition_list modify partition t_list_p1 add values (31);

相關文章
相關標籤/搜索