Oracle11g維護分割槽(一)——Adding Partitions

Hoegh發表於2015-07-16
 

新增分割槽

本節將介紹如何手動新增新的分割槽到分割槽表,並解釋了為什麼分割槽不能被指定新增到大部分分割槽索引。


向範圍分割槽表新增一個分割槽

使用ALTER TABLE ... ADD PARTITION語句來新增一個新的分割槽到“高”端(表中最後一個分割槽的’HighValue’)。要在開始或在表的中間新增一個分割槽,使用SPLIT PARTITION子句。

例如,考慮這麼一張表,sales,除了包含當前月份的資料,還包含之前12個月份的資料。 199911日,你增加一個分割槽月份,儲存在表空間TSX

點選(此處)摺疊或開啟

  1. ALTER TABLE sales

  2.       ADD PARTITION jan99 VALUES LESS THAN ( '01-FEB-1999' )

  3.       TABLESPACE tsx;

另外,和範圍分割槽表相關的本地索引和全域性索引仍然可用。

向雜湊分割槽表新增一個分割槽

當你向一個雜湊分割槽表新增分割槽時,資料庫會對一個現有分割槽(由資料庫選擇)的所有資料行按照雜湊函式進行重新排列,並將資料填充到新增的分割槽中。因此,如果表非空的話,新增一個雜湊分割槽可能比較費時。

下面的語句顯示了向scubagear表新增一個雜湊分割槽的兩種方式。選擇第一條語句來新增雜湊分割槽,分割槽名稱由系統自動生成,並且分割槽存放在預設表空間。第二條語句同樣也是增加一個分割槽,但是,明確指定了分割槽名稱p_named和表空間名稱gear5

點選(此處)摺疊或開啟

  1. ALTER TABLE scubagear ADD PARTITION;


  2. ALTER TABLE scubagear

  3.       ADD PARTITION p_named TABLESPACE gear5;

索引可能被標識為UNUSABLE,如下表所述:

表型別

索引操作

普通表(堆表)

除非你在ALTER TABLE語句中指定UPDATE INDEXES字句:

對於新增分割槽和重新分配的現有分割槽的本地索引,被標識為UNUSABLE,必須重建。

所有全域性索引,或者分割槽全域性索引的所有分割槽,被標識為UNUSABLE,必須重建。

索引組織表

對於本地索引,和普通表的處理方式一樣。

所有全域性索引保持可用;

向列表分割槽表新增一個分割槽

下面的語句說明了如何向列表分割槽表新增一個新的分割槽,在示例中,指定了新增分割槽的儲存屬性和NOLOGGING屬性。

點選(此處)摺疊或開啟

  1. ALTER TABLE q1_sales_by_region

  2.    ADD PARTITION q1_nonmainland VALUES ('HI', 'PR')

  3.       STORAGE (INITIAL 20K NEXT 20K) TABLESPACE tbs_3

  4.       NOLOGGING;

描述新增分割槽的集合內的所有值不能存在於表的其他分割槽。

如果一個列表分割槽表包含預設分割槽,那麼你不能給它新增新的分割槽,但是你可以拆分預設分割槽。透過這樣做,你不僅有效地建立了一個你指定值的新分割槽,並且第二個分割槽保留為預設分割槽。

與列表分割槽表相關的本地和全域性索引均保持可用。

向間隔分割槽表新增一個分割槽

你不能顯式地向間隔分割槽表中新增一個分割槽,除非你西安鎖定分割槽,這將觸發建立分割槽。當該間隔的資料被插入時,資料庫會自動建立一個間隔分割槽。一般情況下,只有在分割槽交換負載場景中,你才必須顯式建立間隔分割槽。

要改變將來分割槽的間隔,我們可以在ALTER TABLE中使用SET INTERVAL子句。該子句將會改變超過當前最高邊界的所有物化間隔分割槽的間隔。

你也可以使用SET INTERVAL子句來遷移一個存在的範圍分割槽表或者符合範圍分割槽表到間隔分割槽表或複合間隔分割槽表。如果要禁止建立新的分割槽,有效的恢復回一個範圍分割槽表,在SET INTERVAL子句中指定一個空值即可。已建立的間隔分割槽將被轉化為範圍分割槽,對應的HighValue為當前最大值。

如果要提高日期的間隔範圍,你必須確保你在新分割槽的相應邊界。例如,在你的日常間隔分割槽表transactions的最高間隔分割槽邊界是January 30, 2007,你想把間隔修改為一個月,那麼下面的語句將會導致一個錯誤:

點選(此處)摺疊或開啟

  1. ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');


  2. ORA-14767: Cannot specify this interval with existing high bounds

你必須建立另外一個以February 1, 2007為邊界的日常間隔分割槽,這樣才能成功修改間隔。

點選(此處)摺疊或開啟

  1. LOCK TABLE transactions PARTITION FOR(TO_DATE('31-JAN-2007','dd-MON-yyyy') IN SHARE MODE;


  2. ALTER TABLE transactions SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH');

間隔分割槽表的第一個分割槽其實是一個範圍分割槽,你可以拆分範圍分割槽,在間隔分割槽表中新增更多的分割槽。

如果要禁用transactions表的間隔分割槽,使用以下語句:

點選(此處)摺疊或開啟

  1. ALTER TABLE transactions SET INTERVAL ();

向雜湊複合分割槽表新增分割槽

可以在分割槽和雜湊子分割槽兩個級別來新增分割槽。

新增一個分割槽

向一個【範圍|列表|間隔】-雜湊複合分割槽表新增一個分割槽如前所述。對於一個間隔-雜湊分割槽表,間隔分割槽是自動建立的。你可以指定SUBPARTITIONS子句來指定子分割槽的數量,或者指定SUBPARTITION子句來命名具體子分割槽。如果沒有指定SUBPARTITIONS子句或者SUBPARTITION子句,那麼分割槽將繼承表級別的預設屬性。對於一個間隔-雜湊分割槽表,你只能向範圍或者已經物化的間隔分割槽新增子分割槽。

這個例子向一個範圍-雜湊分割槽表sales新增了一個範圍分割槽q1_2000,該分割槽用來儲存2000年第一季度的資料。其中,有8個子分割槽儲存在tbs5表空間。子分割槽不能顯式使用表壓縮。在這個例子中,子分割槽會繼承分割槽級別的壓縮屬性並以壓縮形式儲存。

點選(此處)摺疊或開啟

  1. ALTER TABLE sales ADD PARTITION q1_2000

  2.       VALUES LESS THAN (2000, 04, 01) COMPRESS

  3.       SUBPARTITIONS 8 STORE IN tbs5;

新增一個子分割槽


你可以在ALTER TABLE語句中使用MODIFY PARTITION ... ADD SUBPARTITION子句來向一個【範圍|列表|間隔】-雜湊複合分割槽表新增一個雜湊子分割槽。資料庫將會根據雜湊函式,對同一分割槽內的一個已有子分割槽的所有資料行重新進行雜湊排列,並將其中部分資料填充到新增子分割槽中。對於一個間隔-雜湊分割槽表,你只能向範圍分割槽或者已經物化的間隔分割槽新增子分割槽。

在下面的示例中,一個儲存在us1表空間的新雜湊子分割槽us_loc5 被新增到diving表的範圍分割槽locations_us中。

點選(此處)摺疊或開啟

  1. ALTER TABLE diving MODIFY PARTITION locations_us

  2.       ADD SUBPARTITION us_locs5 TABLESPACE us1;

 

除非你指定了UPDATE INDEXES子句,否則,必須重建和新增子分割槽以及重新進行雜湊排列子分割槽相關的索引子分割槽。


向列表複合分割槽表新增分割槽

可以在分割槽和列表子分割槽兩個級別來新增分割槽。

新增一個分割槽

向一個【範圍|列表|間隔】-列表複合分割槽表新增一個分割槽如前所述。對於一個間隔-雜湊分割槽表,間隔分割槽是自動建立的。你可以透過SUBPARTITION子句來給子分割槽命名和提供值列表。如果沒有指定SUBPARTITION子句,那麼子分割槽將繼承子分割槽模板。如果沒有子分割槽模板,那麼將會建立一個單獨的預設子分割槽。

如例子4-28所示,向範圍-列表分割槽表quarterly_regional_sales增加一個新的分割槽,並且指定了一些新的物理屬性,對於沒有指定的其他屬性則繼承表的預設屬性。

4-28 向範圍-列表分割槽表新增分割槽

點選(此處)摺疊或開啟

  1. ALTER TABLE quarterly_regional_sales

  2.    ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))

  3.       STORAGE (INITIAL 20K NEXT 20K) TABLESPACE ts3 NOLOGGING

  4.          (

  5.           SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),

  6.           SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),

  7.           SUBPARTITION q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),

  8.           SUBPARTITION q1_2000_southeast VALUES ('FL', 'GA'),

  9.           SUBPARTITION q1_2000_northcentral VALUES ('SD', 'WI'),

  10.           SUBPARTITION q1_2000_southcentral VALUES ('OK', 'TX')

  11.          );


新增一個子分割槽

你可以在ALTER TABLE語句中使用MODIFY PARTITION ... ADD SUBPARTITION子句來向一個【範圍|列表|間隔】-列表複合分割槽表新增一個列表子分割槽。對於一個間隔-列表分割槽表,你只能向範圍分割槽或者已經物化的間隔分割槽新增子分割槽。

在下面的示例中,向範圍-列表分割槽表quarterly_regional_sales的子分割槽集合中新增一個子分割槽,新增子分割槽儲存在ts2表空間。

點選(此處)摺疊或開啟

  1. ALTER TABLE quarterly_regional_sales

  2.    MODIFY PARTITION q1_1999

  3.       ADD SUBPARTITION q1_1999_south

  4.          VALUES ('AR','MS','AL') tablespace ts2;

 

向範圍複合分割槽表新增分割槽

可以在分割槽和列表子分割槽兩個級別來新增分割槽。

新增一個分割槽

向一個【範圍|列表|間隔】-範圍複合分割槽表新增一個分割槽如前所述。對於一個間隔-雜湊分割槽表,間隔分割槽是自動建立的。你可以透過SUBPARTITION子句來給子分割槽命名和提供值列表。如果沒有指定SUBPARTITION子句,那麼子分割槽將繼承子分割槽模板。如果沒有子分割槽模板,那麼將會建立一個單獨的子分割槽,其最大值為MAXVALUE

如例子4-29所示,向範圍-範圍分割槽表shipments增加一個新的範圍分割槽p_2007_jan,新的分割槽將用來儲存20071月份的資料。在這個例子中,新增分割槽包含3個子分割槽,子分割槽會繼承分割槽級別的壓縮屬性並以壓縮形式儲存。

4-29 向範圍-範圍分割槽表新增分割槽

點選(此處)摺疊或開啟

  1. ALTER TABLE shipments

  2.    ADD PARTITION p_2007_jan

  3.       VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy')) COMPRESS

  4.       ( SUBPARTITION p07_jan_e VALUES LESS THAN (TO_DATE('15-FEB-2007','dd-MON-yyyy'))

  5.       , SUBPARTITION p07_jan_a VALUES LESS THAN (TO_DATE('01-MAR-2007','dd-MON-yyyy'))

  6.       , SUBPARTITION p07_jan_l VALUES LESS THAN (TO_DATE('01-APR-2007','dd-MON-yyyy'))

  7.       ) ;


新增一個子分割槽

你可以在ALTER TABLE語句中使用MODIFY PARTITION ... ADD SUBPARTITION子句來向一個【範圍|列表|間隔】-範圍複合分割槽表新增一個範圍子分割槽。對於一個間隔-範圍分割槽表,你只能向範圍分割槽或者已經物化的間隔分割槽新增子分割槽。

下面的示例中,向shipments表新增一個新的範圍分割槽,包含所有order_date欄位值在20071月份並且delivery_date欄位值大於等於200741日的資料。

點選(此處)摺疊或開啟

  1. ALTER TABLE shipments

  2.    MODIFY PARTITION p_2007_jan

  3.       ADD SUBPARTITION p07_jan_vl VALUES LESS THAN (MAXVALUE) ;


 

向引用分割槽新增一個分割槽或子分割槽

就像分割槽和子分割槽可以被新增到範圍分割槽表、雜湊分割槽表、列表分割槽表或者符合分割槽表一樣,我們可以在引用分割槽的定義中向父表新增分割槽或者子分割槽。新增操作自動級聯到所有引用分割槽表中。當你向主表新增分割槽或者子分割槽時,你可以透過DEPENDENT TABLES子句來為相關表設定屬性。

新增索引分割槽

你不能顯式地給本地索引新增分割槽,相反,只有當你向基表中新增一個分割槽時,一個新的分割槽也會新增到本地索引中。具體來說,當你發出ALTER TABLE語句來向一個包含本地索引的表新增分割槽時,一個匹配的分割槽也會同時新增到本地索引中。資料庫會給新的索引分割槽指定名稱和預設物理儲存屬性,但是,在ADD PARTITION操作完成後你也可以對其重新命名。

你可以在ADD PARTITION操作中,透過首先修改索引的預設屬性來給索引分割槽指定一個新的表空間。例如,設想有一個本地索引q1_sales_by_region_locix,隸屬於列表分割槽表q1_sales_by_region。如果,在新增分割槽q1_nonmainland之前,如上文中“向列表分割槽表中新增分割槽”所示,你可以執行以下語句,那麼相關的索引分割槽將會被建立在tbs_4表空間中。

點選(此處)摺疊或開啟

  1. ALTER INDEX q1_sales_by_region_locix

  2.    MODIFY DEFAULT ATTRIBUTES TABLESPACE tbs_4;



否則,在新增分割槽後,你必須使用以下語句將索引分割槽移動到
tbs_4表空間。

點選(此處)摺疊或開啟

  1. ALTER INDEX q1_sales_by_region_locix

  2.    REBUILD PARTITION q1_nonmainland TABLESPACE tbs_4;

可以使用ALTER INDEX…ADD PARTITION語句來向全域性雜湊分割槽索引新增一個分割槽。資料庫將會新增新的雜湊分割槽,並且對索引的一個現存子分割槽的所有條目根據雜湊函式重新進行雜湊排列,並將其中的部分資料填充到新增分割槽索引中。下面的語句向索引hgidx新增分割槽索引p5

點選(此處)摺疊或開啟

  1. ALTER INDEX hgidx ADD PARTITION p5;


你不能向全域性範圍分割槽索引新增分割槽,因為最高分割槽的邊界值通常為MAXVALUE。為了新增一個新的最高分割槽,使用ALTER INDEX ... SPLIT PARTITION語句。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30162081/viewspace-1735249/,如需轉載,請註明出處,否則將追究法律責任。

相關文章