Oracle11g維護分割槽(五)——Merging Partitions

Hoegh發表於2015-07-27

合併分割槽

使用ALTER TABLE ... MERGE PARTITION語句將兩個分割槽的內容合併到一個分割槽。原來的兩個分割槽將會被刪除,相關的本地索引也會被刪除。對於雜湊分割槽表或者複合雜湊分割槽表的雜湊子分割槽,你不能使用這個語句。

對於引用分割槽表,你不能合併分割槽。相反,父表的合併操作會級聯到所有子表。儘管如此,當你在父表執行合併分割槽或者子分割槽操作時,你也可以使用DEPENDENT TABLES子句來為相關表設定特定屬性。

如果涉及到的分割槽或者子分割槽包含資料,那麼索引可能被標識為UNUSABLE,如下表所述:

表型別

索引操作

普通表(堆表) 

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

   l  資料庫將生成的所有相關本地索引分割槽或者子分割槽標識為UNUSABLE

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

索引組織表

   l  生成的所有相關本地索引分割槽標識為UNUSABLE

   l  所有全域性索引保持可用。

 

合併範圍分割槽

你可以將兩個相鄰的範圍分割槽的內容合併到一個分割槽。不相鄰的範圍分割槽不能合併。合併生成的分割槽繼承了這兩個合併分割槽中更高的上限。

合併範圍分割槽的一個原因是保持線上歷史資料在較大的分割槽。例如,你可以有每日分割槽,然後將最舊的分割槽聚合為周分割槽,進而周分割槽可以聚合為月分割槽,等等。

4-31顯示了一個合併範圍分割槽的例子。
例4-31 合併範圍分割槽

點選(此處)摺疊或開啟

  1. -- First, create a partitioned table with four partitions, each on its own
  2. -- tablespace partitioned by range on the data column
  3. --
  4. CREATE TABLE four_seasons
  5. (
  6.         one DATE,
  7.         two VARCHAR2(60),
  8.         three NUMBER
  9. )
  10. PARTITION BY RANGE ( one )
  11. (
  12. PARTITION quarter_one
  13.    VALUES LESS THAN ( TO_DATE('01-apr-1998','dd-mon-yyyy'))
  14.    TABLESPACE quarter_one,
  15. PARTITION quarter_two
  16.    VALUES LESS THAN ( TO_DATE('01-jul-1998','dd-mon-yyyy'))
  17.    TABLESPACE quarter_two,
  18. PARTITION quarter_three
  19.    VALUES LESS THAN ( TO_DATE('01-oct-1998','dd-mon-yyyy'))
  20.    TABLESPACE quarter_three,
  21. PARTITION quarter_four
  22.    VALUES LESS THAN ( TO_DATE('01-jan-1999','dd-mon-yyyy'))
  23.    TABLESPACE quarter_four
  24. );
  25. --
  26. -- Create local PREFIXED index on Four_Seasons
  27. -- Prefixed because the leftmost columns of the index match the
  28. -- Partitioning key
  29. --
  30. CREATE INDEX i_four_seasons_l ON four_seasons ( one,two )
  31. LOCAL (
  32. PARTITION i_quarter_one TABLESPACE i_quarter_one,
  33. PARTITION i_quarter_two TABLESPACE i_quarter_two,
  34. PARTITION i_quarter_three TABLESPACE i_quarter_three,
  35. PARTITION i_quarter_four TABLESPACE i_quarter_four
  36. );
  37.  
  38. -- Next, merge the first two partitions
  39. ALTER TABLE four_seasons
  40. MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two
  41. UPDATE INDEXES;
如果你省略了上述語句中的UPDATE INDEXES子句,那麼你必須重建受影響分割槽的本地索引。

點選(此處)摺疊或開啟

  1. -- Rebuild index for quarter_two, which has been marked unusable
  2. -- because it has not had all of the data from Q1 added to it.
  3. -- Rebuilding the index corrects this.
  4. --
  5. ALTER TABLE four_seasons MODIFY PARTITION
  6. quarter_two REBUILD UNUSABLE LOCAL INDEXES;


合併間隔分割槽

你可以將兩個相鄰的間隔分割槽的內容合併到一個分割槽。不相鄰的間隔分割槽不能合併。第一個間隔分割槽也能喝最高的範圍分割槽進行合併。合併生成的分割槽繼承了這兩個合併分割槽中更高的上限。

合併間隔分割槽總是導致轉換點移動到這兩個合併分割槽中更高的上限。結果是間隔分割槽表的範圍分割槽擴充套件到這兩個合併分割槽中更高的上限。任何邊界低於新合併生成分割槽的物化間隔分割槽,都會自動轉化到範圍分割槽,並且使用它們的間隔分割槽上限定義作為範圍分割槽上限。

例如,考慮一下間隔分割槽transactions

點選(此處)摺疊或開啟

  1. CREATE TABLE transactions
  2. ( id NUMBER
  3. , transaction_date DATE
  4. , value NUMBER
  5. )
  6. PARTITION BY RANGE (transaction_date)
  7. INTERVAL (NUMTODSINTERVAL(1,'DAY'))
  8. ( PARTITION p_before_2007 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy')));
把資料插入到該表的間隔分割槽部分,這將會建立這些日期的間隔分割槽。需要注意的是,2007115日和2007116日的資料被儲存到相鄰的間隔分割槽。

點選(此處)摺疊或開啟

  1. INSERT INTO transactions VALUES (1,TO_DATE('15-JAN-2007','dd-MON-yyyy'),100);
  2. INSERT INTO transactions VALUES (2,TO_DATE('16-JAN-2007','dd-MON-yyyy'),600);
  3. INSERT INTO transactions VALUES (3,TO_DATE('30-JAN-2007','dd-MON-yyyy'),200);
接下來,合併兩個相鄰的間隔分割槽。新分割槽會再有一個系統生成的名稱。

點選(此處)摺疊或開啟

  1. ALTER TABLE transactions
  2. MERGE PARTITIONS FOR(TO_DATE('15-JAN-2007','dd-MON-yyyy'))
  3. , FOR(TO_DATE('16-JAN-2007','dd-MON-yyyy'));
對於transactions表而言,轉換點現在已經移動到了2007117日。該間隔分割槽表的範圍分割槽部分包含兩個範圍分割槽:值小於200711日,以及值小於2007117日。值大於2007117日的資料將會儲存在間隔分割槽表的間隔分割槽部分。

 

合併列表分割槽

當你合併列表分割槽時,本合併的分割槽可以是任意兩個分割槽。它們不必像範圍分割槽那樣必須是相鄰的,因為列表分割槽預設是沒有順序的。生成的分割槽由原來兩個分割槽的資料組成。如果你將預設分割槽和其他分割槽進行合併,那麼新生成的分割槽是預設分割槽。

下面的語句合併了一個列表分割槽表的兩個分割槽,新生成的分割槽繼承了所有表級別的預設屬性。語句指定了MAXEXTENTS子句。

點選(此處)摺疊或開啟

  1. ALTER TABLE q1_sales_by_region
  2.    MERGE PARTITIONS q1_northcentral, q1_southcentral
  3.    INTO PARTITION q1_central
  4.       STORAGE(MAXEXTENTS 20);
  5. 原來的兩個分割槽的值列表如下:
  6. PARTITION q1_northcentral VALUES ('SD','WI')
  7. PARTITION q1_southcentral VALUES ('OK','TX')
  8. 由此生成的sales_west分割槽值列表包括這兩個分割槽值列表的集合,更具體的說:
  9. ('SD','WI','OK','TX')

合併複合雜湊分割槽

當你合併複合雜湊分割槽時,子分割槽會根據雜湊函式重新分佈到由SUBPARTITIONS n或者SUBPARTITIONS子句指定數量的分割槽。如果兩個都沒有指定,那麼就使用表級別的預設值。

需要注意的是,分割一個複合雜湊分割槽(在“分割一個複合雜湊分割槽”章節討論)和合並兩個複合雜湊分割槽,在屬性的繼承方面是不一樣的。當一個分割槽被分割時,新的分割槽可以繼承原分割槽的屬性,因為只有一個父節點。但是,當合並分割槽時,必須繼承表級別屬性。

對於間隔雜湊分割槽表,你只能合併兩個相鄰的間隔分割槽,或者時最高範圍分割槽和第一個間隔分割槽。如“合併間隔分割槽”所述,當你在間隔雜湊分割槽表合併分割槽時,轉換點時會移動的。

下面的例子合併了兩個範圍雜湊分割槽:

點選(此處)摺疊或開啟

  1. ALTER TABLE all_seasons
  2.    MERGE PARTITIONS quarter_1, quarter_2 INTO PARTITION quarter_2
  3.    SUBPARTITIONS 8;

合併複合列表分割槽

你可以在分割槽級別合併分割槽,也可以在列表子分割槽級別合併子分割槽。

在一個複合列表分割槽表中合併分割槽

在複合列表分割槽表中合併分割槽如前面所論述的“合併範圍分割槽”。但是,當你合併兩個複合列表分割槽時,生成的新分割槽將繼承子分割槽模版的子分割槽描述,前提是該模版存在。如果不存在子分割槽模版,那麼將為新分割槽建立一個預設子分割槽。

對於間隔雜湊分割槽表,你只能合併兩個相鄰的間隔分割槽,或者時最高範圍分割槽和第一個間隔分割槽。如“合併間隔分割槽”所述,當你在間隔雜湊分割槽表合併分割槽時,轉換點時會移動的。

下面的語句合併了範圍列表分割槽表stripe_regional_sales的兩個分割槽。該表存在一個子分割槽模版。

點選(此處)摺疊或開啟

  1. ALTER TABLE stripe_regional_sales
  2.    MERGE PARTITIONS q1_1999, q2_1999 INTO PARTITION q1_q2_1999
  3.       STORAGE(MAXEXTENTS 20);
對於新的分割槽,我們指定了一些新的物理屬性,同時,對於那些沒有指定的屬性將會繼承表級別的預設值。新生成的分割槽q1_q2_1999將會繼承q2_1999分割槽的上限邊界,並且子分割槽的值列表描述將會繼承該表的子分割槽模版描述。

新生成分割槽的資料由兩個分割槽的資料組成。但是,可能存在資料庫返回錯誤的情況。這個之所以會發生,可能是因為當同時滿足下列條件時,資料可能會對映到新分割槽之外:

l   合併後子分割槽的一些值可能並不屬於子分割槽模版。

l   子分割槽模版不包含預設分割槽定義。

我們可以透過在預設子分割槽模版中指定一個預設分割槽來消除這個錯誤條件。

 

在一個複合列表分割槽表中合併子分割槽

你可以合併同一分割槽中的任意兩個列表子分割槽的內容。由此生成的子分割槽值列表描述包括所有被合併分割槽的值。

下面的語句合併了範圍列表分割槽表的兩個子分割槽,並將新生成的子分割槽儲存到表空間ts4:

點選(此處)摺疊或開啟

  1. ALTER TABLE quarterly_regional_sales
  2.    MERGE SUBPARTITIONS q1_1999_northwest, q1_1999_southwest
  3.       INTO SUBPARTITION q1_1999_west
  4.          TABLESPACE ts4;

原始的兩個分割槽的值列表如下:

l   子分割槽q1_1999_northwest被描述為('WA','OR')

l   子分割槽q1_1999_southwest被描述為('AZ','NM','UT')

新生成子分割槽的值列表由上述兩個子分割槽值列表的合集構成:

l   子分割槽q1_1999_west被描述為('WA','OR','AZ','NM','UT')

新生成子分割槽的儲存表空間以及子分割槽屬性都由分割槽級別的預設屬性決定,除非你顯式地指定。

如果任何現有地子分割槽名稱被重複使用,那麼新生成子分割槽將會繼承名稱被重複使用子分割槽的屬性。

合併複合範圍分割槽

你可以在分割槽級別合併分割槽,也可以在範圍子分割槽級別合併子分割槽。

在一個複合範圍分割槽表中合併分割槽

在複合範圍分割槽表中合併分割槽如前面所論述的“合併範圍分割槽”。但是,當你合併兩個複合範圍分割槽時,生成的新分割槽將繼承子分割槽模版的子分割槽描述,前提是該模版存在。如果不存在子分割槽模版,那麼將會建立一個上限邊界是MAXVALUE的新分割槽。

對於間隔範圍分割槽表,你只能合併兩個相鄰的間隔分割槽,或者時最高範圍分割槽和第一個間隔分割槽。如“合併間隔分割槽”所述,當你在間隔雜湊分割槽表合併分割槽時,轉換點時會移動的。

下面的語句合併了月份間隔範圍分割槽表orders的兩個分割槽。該表存在一個子分割槽模版。

點選(此處)摺疊或開啟

  1. ALTER TABLE orders
  2. MERGE PARTITIONS FOR(TO_DATE('01-MAR-2007','dd-MON-yyyy')),
  3. FOR(TO_DATE('01-APR-2007','dd-MON-yyyy'))
  4. INTO PARTITION p_pre_may_2007;
如果20073月和4月的分割槽仍然在間隔範圍分割槽表的間隔部分,那麼合併操作將會把轉換點移動到200751日。

對於分割槽p_pre_may_2007而言,所有子分割槽都將從子分割槽模版中繼承他們的屬性。新生成分割槽的資料由兩個分割槽的資料組成。但是,可能存在資料庫返回錯誤的情況。這個之所以會發生,可能是因為當同時滿足下列條件時,資料可能會對映到新分割槽之外:

l   合併後子分割槽的一些值可能並不屬於子分割槽模版。

l   子分割槽模版不包含一個上限邊界值為MAXVALUE的子分割槽定義。

我們可以透過在子分割槽模版中指定一個上限邊界值為MAXVALUE的子分割槽來消除這個錯誤條件。

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

相關文章