天天看點

Oracle中分區表中表空間屬性

Oracle中的分區表是Oracle中的一個很好的特性,可以把大表劃分成多個小表,進而提高對于該大表的SQL執行效率,而各個分區對應用又是透明的。

分區表中的每個分區有獨立的存儲特性,包括表空間、PCT_FREE等。那分區表中的各分區表空間之間有什麼關系?建立的分區會建立在哪個表空間中呢?對應的local分區索引又會使用哪個表空間呢?下面使用一個例子來解釋上面的這些問題。

建立測試分區表:

<code>zx@TEST&gt;</code><code>create</code> <code>table</code> <code>t (id number,</code><code>name</code> <code>varchar2(10))</code>

<code>  </code><code>2  tablespace users</code>

<code>  </code><code>3  partition </code><code>by</code> <code>range(id)</code>

<code>  </code><code>4  (</code>

<code>  </code><code>5  partition p1 </code><code>values</code> <code>less than (10) tablespace example,</code>

<code>  </code><code>6  partition p2 </code><code>values</code> <code>less than (20) tablespace system,</code>

<code>  </code><code>7  partition p3 </code><code>values</code> <code>less than (30)</code>

<code>  </code><code>8  );</code>

上面建立了一個range分區表T,對表T指定了表空間為users,分區p1表空間為example,分區p2表空間為system,分區p3表空間沒有指定。

下面分别從user_tables、user_tab_partitions視圖中檢視對應的表空間

<code>zx@TEST&gt;col tablespace_name </code><code>for</code> <code>a30</code>

<code>zx@TEST&gt;col partition_name </code><code>for</code> <code>a30</code>

<code>zx@TEST&gt;</code><code>select</code> <code>tablespace_name,partitioned </code><code>from</code> <code>user_tables </code><code>where</code> <code>table_name=</code><code>'T'</code><code>;</code>

<code>TABLESPACE_NAME           PARTITION</code>

<code>------------------------------ ---------</code>

<code>                   </code><code>YES</code>

<code>zx@TEST&gt;</code><code>select</code> <code>partition_name,tablespace_name </code><code>from</code> <code>user_tab_partitions </code><code>where</code> <code>table_name=</code><code>'T'</code><code>;</code>

<code>PARTITION_NAME             TABLESPACE_NAME</code>

<code>------------------------------ ------------------------------</code>

<code>P1                 EXAMPLE</code>

<code>P2                 SYSTEM</code>

<code>P3                 USERS</code>

從上面的查詢可以看出,分區表T在user_tables視圖中沒有記錄表空間名的資訊,分區P1和P2對應的分區與建表語句中指定的一緻,分區P3對應的分區與表T指定的表空間一緻為USERS。難道表T就沒有表空間屬性麼?我們使用dbms_metadata.get_ddl檢視表T的語句:

<a href="https://s2.51cto.com/wyfs02/M01/96/EF/wKioL1km3uaiZzdhAAC7zPV8vnE762.png" target="_blank"></a>

從上圖中可以看出表T其實也是有表空間屬性的,就是在建表時指定的USERS表空間。而分區P3繼承了這一屬性。那為什麼說是分區P3繼承了這一屬性呢,我們查詢下面的視圖:

<code>zx@TEST&gt;col table_name </code><code>for</code> <code>a30</code>

<code>zx@TEST&gt;</code><code>select</code> <code>table_name,def_tablespace_name </code><code>from</code> <code>user_part_tables;</code>

<code>TABLE_NAME             DEF_TABLESPACE_NAME</code>

<code>------------------------------ ---------------------------------</code>

<code>T                  USERS</code>

官方文檔對列def_tablespace_name的解釋是Default tablespace to be used when adding a partition。從上面的查詢可以知道,表T的分區如果沒有明确指定表空間時都會使用USERS表空間。事實是這樣麼,下面給表T添加一個表空間:

<code>zx@TEST&gt;</code><code>alter</code> <code>table</code> <code>t </code><code>add</code> <code>partition p4 </code><code>values</code> <code>less than (40);</code>

<code>Table</code> <code>altered.</code>

<code>P4                 USERS</code>

從上面可以看到,新添加的分區P4對應的表空間是USERS,證明了前面的觀點。

如果目前的表空間已經無法擴充,想把新加的分區建立到其他表空間中,而在加表空間時不指定表空間資訊,可以實作麼?答案是肯定可以。

<code>zx@TEST&gt;</code><code>alter</code> <code>table</code> <code>t </code><code>modify</code> <code>default</code> <code>attributes tablespace example;</code>

<code>------------------------------ ------------------------------------------------------------------------------------------</code>

<code>T                  EXAMPLE</code>

<code>zx@TEST&gt;</code><code>alter</code> <code>table</code> <code>t </code><code>add</code> <code>partition p5 </code><code>values</code> <code>less than (50);</code>

<code>P5                 EXAMPLE</code>

從上面可以看到在修改了表T的表空間屬性後,新加的分區P5建立在EXAMPLE表空間中。

下面再來看local分區索引對應的表空間。先在表上建立一個分區索引。

<code>zx@TEST&gt;</code><code>create</code> <code>index</code> <code>idx_t </code><code>on</code> <code>t(id) </code><code>local</code><code>;</code>

<code>Index</code> <code>created.</code>

下面看看local分區索引對應的表空間的屬性:

<code>zx@TEST&gt;</code><code>select</code> <code>tablespace_name,partitioned </code><code>from</code> <code>user_indexes </code><code>where</code> <code>index_name=</code><code>'IDX_T'</code><code>;</code>

<code>zx@TEST&gt;</code><code>select</code> <code>partition_name,partition_position,tablespace_name </code><code>from</code> <code>user_ind_partitions </code><code>where</code> <code>index_name=</code><code>'IDX_T'</code><code>;</code>

<code>PARTITION_NAME             PARTITION_POSITION TABLESPACE_NAME</code>

<code>------------------------------ ------------------ ------------------------------</code>

<code>P1                      1 EXAMPLE</code>

<code>P2                      2 SYSTEM</code>

<code>P3                      3 USERS</code>

<code>P4                      4 USERS</code>

<code>P5                      5 EXAMPLE</code>

從上面的查詢可以看出,local分區索引上沒有表空間資訊,而每個索引分區對應的表空間名與相應的分區所在的表空間一緻。我們同樣使用dbms_metadata包來檢視索引的建表語句:

<code>zx@TEST&gt;col index_name </code><code>for</code> <code>a30</code>

<code>zx@TEST&gt;col def_tablespace_name </code><code>for</code> <code>a30</code>

<code>zx@TEST&gt;</code><code>select</code> <code>index_name,def_tablespace_name </code><code>from</code> <code>user_part_indexes </code><code>where</code> <code>index_name=</code><code>'IDX_T'</code><code>;</code>

<code>INDEX_NAME             DEF_TABLESPACE_NAME</code>

<code>IDX_T</code>

從上面的查詢中可以看到索引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分區索引所在的表空間與表分區所在的表空間分開來麼?答案是肯定可以的。在建立本地索引進指定表空間參數即可:

<code>zx@TEST&gt;</code><code>drop</code> <code>index</code> <code>idx_t;</code>

<code>Index</code> <code>dropped.</code>

<code>zx@TEST&gt;</code><code>create</code> <code>index</code> <code>idx_t </code><code>on</code> <code>t(id) </code><code>local</code> <code>tablespace sysaux;</code>

<code>                   </code> 

<code>P1                      1 SYSAUX</code>

<code>P2                      2 SYSAUX</code>

<code>P3                      3 SYSAUX</code>

<code>P4                      4 SYSAUX</code>

<code>P5                      5 SYSAUX</code>

<code>IDX_T                  SYSAUX</code>

從上面的查詢中可以看到所有的分區索引的表空間都為SYSAUX。

建立一個新的分區,看對應的分區索引是否還是在SYSAUX表空間:

<code>zx@TEST&gt;</code><code>alter</code> <code>table</code> <code>t </code><code>add</code> <code>partition p6 </code><code>values</code> <code>less than (60);</code>

<code>P6                      6 SYSAUX</code>

從上面可以看出新的分區索引所在的表空間仍是SYSAUX。

下面來看如何修改新分區索引建立的對應的表空間:

<code>zx@TEST&gt;</code><code>alter</code> <code>index</code> <code>idx_t </code><code>modify</code> <code>default</code> <code>attributes tablespace users;</code>

<code>Index</code> <code>altered.</code>

<code>IDX_T                  USERS</code>

<code>zx@TEST&gt;</code><code>alter</code> <code>table</code> <code>t </code><code>add</code> <code>partition p7 </code><code>values</code> <code>less than (70);</code>

<code>P7                      7 USERS</code>

從上面的結果可以看出,新加分區對應的分區索引的表空間變為了新指定的USERS。修改成功。

      本文轉自hbxztc 51CTO部落格,原文連結:http://blog.51cto.com/hbxztc/1929585,如需轉載請自行聯系原作者