Oracle中的分區表是Oracle中的一個很好的特性,可以把大表劃分成多個小表,從而提高對于該大表的SQL執行效率,而各個分區對應用又是透明的。
分區表中的每個分區有獨立的存儲特性,包括表空間、PCT_FREE等。那分區表中的各分區表空間之間有什么關系?新建的分區會創建在哪個表空間中呢?對應的local分區索引又會使用哪個表空間呢?下面使用一個例子來解釋上面的這些問題。
創建測試分區表:
zx@TEST>create?table?t?(id?number,name?varchar2(10))2??tablespace?users3??partition?by?range(id)4??(5??partition?p1?values?less?than?(10)?tablespace?example,6??partition?p2?values?less?than?(20)?tablespace?system,7??partition?p3?values?less?than?(30)8??);
上面創建了一個range分區表T,對表T指定了表空間為users,分區p1表空間為example,分區p2表空間為system,分區p3表空間沒有指定。
下面分別從user_tables、user_tab_partitions視圖中查看對應的表空間
zx@TEST>col?tablespace_name?for?a30
zx@TEST>col?partition_name?for?a30
zx@TEST>select?tablespace_name,partitioned?from?user_tables?where?table_name='T';TABLESPACE_NAME? ???????PARTITION
------------------------------?---------YESzx@TEST>select?partition_name,tablespace_name?from?user_tab_partitions?where?table_name='T';PARTITION_NAME ???????TABLESPACE_NAME
------------------------------?------------------------------
P1 ???????EXAMPLE
P2 ???????SYSTEM
P3 ???????USERS
從上面的查詢可以看出,分區表T在user_tables視圖中沒有記錄表空間名的信息,分區P1和P2對應的分區與建表語句中指定的一致,分區P3對應的分區與表T指定的表空間一致為USERS。難道表T就沒有表空間屬性么?我們使用dbms_metadata.get_ddl查看表T的語句:
從上圖中可以看出表T其實也是有表空間屬性的,就是在建表時指定的USERS表空間。而分區P3繼承了這一屬性。那為什么說是分區P3繼承了這一屬性呢,我們查詢下面的視圖:
zx@TEST>col?table_name?for?a30
zx@TEST>select?table_name,def_tablespace_name?from?user_part_tables;TABLE_NAME ???????DEF_TABLESPACE_NAME
------------------------------?---------------------------------
T ???????USERS
官方文檔對列def_tablespace_name的解釋是Default tablespace to be used when adding a partition。從上面的查詢可以知道,表T的分區如果沒有明確指定表空間時都會使用USERS表空間。事實是這樣么,下面給表T添加一個表空間:
zx@TEST>alter?table?t?add?partition?p4?values?less?than?(40);Table?altered.zx@TEST>select?partition_name,tablespace_name?from?user_tab_partitions?where?table_name='T';PARTITION_NAME ???????TABLESPACE_NAME
------------------------------?------------------------------
P1 ???????EXAMPLE
P2 ???????SYSTEM
P3 ???????USERS
P4 ???????USERS
從上面可以看到,新添加的分區P4對應的表空間是USERS,證實了前面的觀點。
如果當前的表空間已經無法擴展,想把新加的分區創建到其他表空間中,而在加表空間時不指定表空間信息,可以實現么?答案是肯定可以。
zx@TEST>alter?table?t?modify?default?attributes?tablespace?example;Table?altered.zx@TEST>select?table_name,def_tablespace_name?from?user_part_tables;TABLE_NAME ???????DEF_TABLESPACE_NAME
------------------------------?------------------------------------------------------------------------------------------
T ???????EXAMPLEzx@TEST>alter?table?t?add?partition?p5?values?less?than?(50);Table?altered.zx@TEST>select?partition_name,tablespace_name?from?user_tab_partitions?where?table_name='T';PARTITION_NAME ???????TABLESPACE_NAME
------------------------------?------------------------------
P1 ???????EXAMPLE
P2 ???????SYSTEM
P3 ???????USERS
P4 ???????USERS
P5 ???????EXAMPLE
從上面可以看到在修改了表T的表空間屬性后,新加的分區P5創建在EXAMPLE表空間中。
下面再來看local分區索引對應的表空間。先在表上創建一個分區索引。
zx@TEST>create?index?idx_t?on?t(id)?local;Index?created.
下面看看local分區索引對應的表空間的屬性:
zx@TEST>select?tablespace_name,partitioned?from?user_indexes?where?index_name='IDX_T';TABLESPACE_NAME? ???????PARTITION
------------------------------?---------YESzx@TEST>select?partition_name,partition_position,tablespace_name?from?user_ind_partitions?where?index_name='IDX_T';PARTITION_NAME ???????PARTITION_POSITION?TABLESPACE_NAME
------------------------------?------------------?------------------------------
P1 1?EXAMPLE
P2 2?SYSTEM
P3 3?USERS
P4 4?USERS
P5 5?EXAMPLE
從上面的查詢可以看出,local分區索引上沒有表空間信息,而每個索引分區對應的表空間名與相應的分區所在的表空間一致。我們同樣使用dbms_metadata包來查看索引的建表語句:
從上圖可以看到索引IDX_T確實沒有表空間屬性。我們再來查看user_part_index來驗證一下是否是真的呢:
zx@TEST>col?index_name?for?a30
zx@TEST>col?def_tablespace_name?for?a30
zx@TEST>select?index_name,def_tablespace_name?from?user_part_indexes?where?index_name='IDX_T';INDEX_NAME ???????DEF_TABLESPACE_NAME
------------------------------?------------------------------
IDX_T
從上面的查詢中可以看到索引IDX_T也沒有默認的表空間存儲選項,而在官方文檔中看到:New partitions or subpartitions added to the local index will be created in the same tablespace(s) as the corresponding partitions or subpartitions of the underlying table。說明local分區索引默認與相關聯的表分區在同一個表空間,上面的查詢也可以驗證這一結論。那可以把local分區索引所在的表空間與表分區所在的表空間分開來么?答案是肯定可以的。在創建本地索引進指定表空間參數即可:
zx@TEST>drop?index?idx_t;Index?dropped.zx@TEST>create?index?idx_t?on?t(id)?local?tablespace?sysaux;Index?created.zx@TEST>select?tablespace_name,partitioned?from?user_indexes?where?index_name='IDX_T';TABLESPACE_NAME? ???????PARTITION
------------------------------?---------YESzx@TEST>select?partition_name,partition_position,tablespace_name?from?user_ind_partitions?where?index_name='IDX_T';PARTITION_NAME ???????PARTITION_POSITION?TABLESPACE_NAME
------------------------------?------------------?------------------------------
P1 1?SYSAUX
P2 2?SYSAUX
P3 3?SYSAUX
P4 4?SYSAUX
P5 5?SYSAUXzx@TEST>select?index_name,def_tablespace_name?from?user_part_indexes?where?index_name='IDX_T';INDEX_NAME ???????DEF_TABLESPACE_NAME
------------------------------?------------------------------
IDX_T ???????SYSAUX
從上面的查詢中可以看到所有的分區索引的表空間都為SYSAUX。
創建一個新的分區,看對應的分區索引是否還是在SYSAUX表空間:
zx@TEST>alter?table?t?add?partition?p6?values?less?than?(60);Table?altered.zx@TEST>select?partition_name,partition_position,tablespace_name?from?user_ind_partitions?where?index_name='IDX_T';PARTITION_NAME ???????PARTITION_POSITION?TABLESPACE_NAME
------------------------------?------------------?------------------------------
P1 1?SYSAUX
P2 2?SYSAUX
P3 3?SYSAUX
P4 4?SYSAUX
P5 5?SYSAUX
P6 6?SYSAUX
從上面可以看出新的分區索引所在的表空間仍是SYSAUX。
下面來看如何修改新分區索引創建的對應的表空間:
zx@TEST>alter?index?idx_t?modify?default?attributes?tablespace?users;Index?altered.zx@TEST>select?index_name,def_tablespace_name?from?user_part_indexes?where?index_name='IDX_T';INDEX_NAME ???????DEF_TABLESPACE_NAME
------------------------------?------------------------------
IDX_T ???????USERSzx@TEST>alter?table?t?add?partition?p7?values?less?than?(70);Table?altered.zx@TEST>select?partition_name,partition_position,tablespace_name?from?user_ind_partitions?where?index_name='IDX_T';PARTITION_NAME ???????PARTITION_POSITION?TABLESPACE_NAME
------------------------------?------------------?------------------------------
P1 1?SYSAUX
P2 2?SYSAUX
P3 3?SYSAUX
P4 4?SYSAUX
P5 5?SYSAUX
P6 6?SYSAUX
P7 7?USERS
從上面的結果可以看出,新加分區對應的分區索引的表空間變為了新指定的USERS。修改成功。
轉載于:https://blog.51cto.com/hbxztc/1929585