通過分割槽進行優化(轉)

passion_of_data發表於2011-06-21

 “分而治之”— 沒有能夠比 Oracle 資料庫的分割槽特性更好地闡釋這個象徵性原則的了。從版本 8 開始,您就可以將一個表或索引劃分成多個段,然後將它們放在不同的表空間內。該表仍作為一個邏輯實體定址,各個分割槽則儲存為單獨的段,這就簡化了資料操作。

在版本 11 中,引用分割槽、間隔分割槽、虛擬列分割槽以及擴充套件的組合分割槽等增強功能支援無限的分割槽設計可能性,並提高了可管理性。

如果您希望在分割槽的基礎以及對您選擇分割槽列或方案的決定有影響的因素上進一步提高,請參閱《Oracle Magazine2006 9/10 月刊上我的文章

擴充套件的組合分割槽

使用組合分割槽 — Oracle8i 資料庫中引入的方案您可以在分割槽中建立子分割槽,從而進一步細分表。但在該情況下,您只能通過雜湊子分割槽對已按範圍分割槽的表進行再次分割槽。Oracle9i 中對組合分割槽進行了擴充套件,使之包括範圍-列表子分割槽。

這些方案滿足了大多數環境(但並非所有環境)的需要。例如,假設您有一個名為 SALES 的包含多列的表,其中包括兩個特殊的列,它們是分割槽的候選列:state_code,它儲存一個表示銷售狀態的兩位程式碼,表面上用於計算銷售稅;以及 product_code,一個用於識別銷售記錄所銷售的產品的三位數字。使用者通過對兩列進行同等的篩選對該表進行查詢,存檔要求也基於這兩列。應用分割槽決策的原則時,您會發現這兩列都是合適的分割槽鍵候選者。

Oracle 資料庫 11g 中,您可以相當輕鬆地解決此問題。在該版本中,並不侷限於範圍-雜湊和範圍-列表組合分割槽。您的選擇實際上沒有任何限制;您可以使用任何組合建立組合分割槽。

在這個示例中,您可以決定根據 product_code(因為該列具有更多離散的值)對錶進行列表分割槽,然後根據 state_code 再次進行列表分割槽。下面的程式碼示例顯示瞭如何實現該操作:

create table sales

(

   sales_id     number,

   product_code number,

   state_code   varchar2(2)

)

partition by list (product_code)

subpartition by list (state_code)

(

   partition p101 values (101)

   (

      subpartition p101_ct values ('CT'),

      subpartition p101_ny values ('NY'),

      subpartition p101_def values (default)

   ),

   partition p201 values (201)

   (

      subpartition p201_ct values ('CT'),

      subpartition p201_ny values ('NY'),

      subpartition p201_def values (default)

   )

)

選擇並不僅限於此處顯示的方法。您還可以建立列表-範圍組合分割槽。在上面的示例中,假設產品程式碼不是離散的,而是在一個範圍內。您將希望根據 state_code 進行列表分割槽,然後再根據 product_code 劃分子分割槽。下面是實現該操作的程式碼示例。

create table sales1

(

   sales_id     number,

   product_code number,

   state_code   varchar2(2)

)

partition by list (state_code)

subpartition by range (product_code)

(

   partition CT values ('CT')

   (

      subpartition ct_100 values less than (101),

      subpartition ct_200 values less than (201)

   ),

   partition NY values ('NY')

   (

      subpartition NY_100 values less than (101),

      subpartition NY_200 values less than (201)

   )

)

您也可以建立範圍-範圍組合分割槽,如果您有兩個日期域,該方法將非常方便。例如,考慮一個用於銷售處理系統的表,該表包括一個交易日期和一個交貨日期。您可能希望根據一個日期進行範圍分割槽,然後再根據另一個日期進行子範圍分割槽。該方案允許您根據日期進行備份、存檔和清除。

總而言之,您在 Oracle 資料庫 11g 中可以建立以下型別的組合分割槽:

  • 範圍-範圍
  • 範圍-雜湊
  • 範圍-列表
  • 列表-範圍
  • 列表-雜湊
  • 列表-列表

引用分割槽


下面是設計分割槽方案過程中的一個典型問題:並非所有表都具有您需要根據其進行分割槽的列。假設您要建立一個銷售系統,該系統包括兩個簡單的表(sales customers):

create table customers

(

   cust_id   number primary key,

   cust_name varchar2(200),

   rating    varchar2(1) not null

)

partition by list (rating)

(

   partition pA values ('A'),

   partition pB values ('B')

);

sales 表的建立如下所示。它是 customers 表的一個子表。

create table sales

(

   sales_id    number primary key,

   cust_id     number not null,

   sales_amt   number,

   constraint  fk_sales_01

    foreign key (cust_id)

    references customers

);

理想情況下,您希望用相同的方式對 sales 表和 customers 表分割槽:根據 rating 列進行列表分割槽。但有一個嚴重問題:sales 表沒有名為 rating 的列!那麼如何根據一個不存在的列進行分割槽呢?

Oracle 資料庫 11g 中,您可以使用一個稱為引用分割槽的新特性。下面的示例顯示瞭如何將該特性應用於 sales 表:

create table sales

(

   sales_id    number primary key,

   cust_id     number not null,

   sales_amt   number,

   constraint  fk_sales_01

    foreign key (cust_id)

    references customers

)

partition by reference (fk_sales_01);

這段程式碼建立了與父表 customers 中相同的分割槽。注意,雖然沒有名為 rating 的列,但仍根據該列對錶進行了分割槽。partition by reference (fk_sales_01) 子句包括了分割槽定義中的外來鍵名。該語句指示 Oracle 資料庫 11g 確認通過父表(在該示例中為 customers)中使用的方案進行了分割槽。注意 cust_id 列的 NOT NULL 約束;這是引用分割槽所必需的。

如果您檢查 sales 表中分割槽的分割槽邊界:

SQL> select partition_name, high_value

  2  from user_tab_partitions

  3  where table_name = 'SALES';

 

PARTITION_NAME  HIGH_VALUE

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

PA

PB

高值為空,這意味著此處的邊界派生自父表。分割槽的名稱與父表中的名稱相同。您可以通過查詢 user_part_tables 檢視來檢查分割槽的型別。一個名為 ref_ptn_constraint_name 的特殊列顯示了外來鍵約束名稱。

SQL> select table_name, partitioning_type, ref_ptn_constraint_name

  2  from user_part_tables

  3  where table_name in ('CUSTOMERS','SALES');

 

TABLE_NAME                     PARTITION REF_PTN_CONSTRAINT_NAME

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

CUSTOMERS                      LIST

SALES                          REFERENCE FK_SALES_01

如果您希望按照父表分割槽的方式對子表進行分割槽,但沒有相同的列,您又不想僅僅為了分割槽而引入這些列,此時引用分割槽將非常方便。而且,您不必針對每個子表顯式宣告一個很長的分割槽子句。

間隔分割槽


範圍分割槽允許您根據分割槽鍵列的值的範圍建立分割槽。下面是一個按範圍分割槽的表的示例:

create table sales6

(

   sales_id    number,

   sales_dt    date

)

partition by range (sales_dt)

(

   partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd')),

   partition p0702 values less than (to_date('2007-03-01','yyyy-mm-dd'))

);

您在此處僅針對 2007 1 月和 2007 2 月定義了分割槽,如果表中插入一條 sales_dt 2007 3 月的記錄,會發生什麼情況?插入將失敗,並顯示以下錯誤:

ORA-14400: inserted partition key does not map to any partition

顯然,您需要針對 2007 3 月新增一個分割槽,然後才能插入一條記錄。但通常說起來容易做起來難。您通常無法容忍事先建立大量分割槽,但其中很少一部分可能會產生此錯誤。

如果 Oracle 以某種方式自動察覺到對新分割槽的需要,然後建立它們,這樣不是更好嗎?Oracle 資料庫 11g 可以,它可以使用一個稱為間隔分割槽的特性。此時,您不必定義分割槽及它們的邊界,只需定義一個定義了每個分割槽邊界的間隔。下面是使用間隔分割槽的示例:

create table sales6

(

   sales_id    number,

   sales_dt    date

)

partition by range (sales_dt)

interval (numtoyminterval(1,'MONTH'))

(

   partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd'))

);

注意子句:interval 後面跟著時間間隔。您在此處指示 Oracle 為每個月份建立一個時間間隔。您已經為 2007 1 月的資料建立了名為 p0701 的初始分割槽。現在,假設您插入了一條包括 2007 6 月資料的記錄:

SQL> insert into sales6 values (1,'01-jun-07');

 

1 row created.

Oracle 不會返回錯誤,而是成功執行該語句。那麼這條記錄將轉向何處?p0701 分割槽不能包括該記錄,我們沒有為 2007 6 月定義分割槽。但此時,如果您檢查該表的分割槽:

SQL> select partition_name, high_value

  2  from user_tab_partitions

  3  where table_name = 'SALES6';

 

PARTITION_NAME  HIGH_VALUE

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

P0701           TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C

                ALENDAR=GREGORIA

 

SYS_P41         TO_DATE(' 2007-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C

                ALENDAR=GREGORIA

注意名為 SYS_P1、高值為 2007 7 1 日的分割槽,它最多可以容納到 6 月底的資料。該分割槽是由 Oracle 動態建立的,並具有一個系統生成的名稱。

現在,假設您輸入一個小於最高值的值,如 2007 5 1 日。理想情況下,它應該具有自己的分割槽,因為您的分割槽時間間隔是一個月。

SQL> insert into sales6 values (1,'01-may-07');

 

1 row created.

 

SQL> select partition_name, high_value

  2  from user_tab_partitions

  3  where table_name = 'SALES6';

 

PARTITION_NAME  HIGH_VALUE

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

P0701           TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C

                ALENDAR=GREGORIA

 

SYS_P41         TO_DATE(' 2007-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C

                ALENDAR=GREGORIA

 

SYS_P42         TO_DATE(' 2007-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C

                ALENDAR=GREGORIA

注意新分割槽 SYS_P42,其上限為 6 1 日,因此該分割槽可以保留 2006 5 月的資料。該分割槽是通過拆分 SYS_P41 分割槽建立的(針對 6 月份)。因此,當您定義一個間隔分割槽方案時,Oracle 會自動建立和維護分割槽。

如果您希望將分割槽儲存在特定表空間中,可以使用 store in 子句執行該操作:

interval (numtoyminterval(1,'MONTH'))

store in (TS1,TS2,TS3)

該子句以迴圈方式將分割槽儲存在表空間 TS1TS2 TS3 中。

應用程式開發人員如何定位特定分割槽?一種方法是知道名稱,這種方法可能不可行,即使您知道名稱,這種方法也非常容易出錯。為了便於訪問特定分割槽,Oracle 資料庫 11g 為分割槽 SQL 提供了一個新語法:

SQL> select * from sales6 partition for (to_date('15-may-2007','dd-mon-yyyy'));

 

  SALES_ID SALES_DT

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

         1 01-MAY-07

注意新子句 for (),它允許您直接引用分割槽,而不必通過它們的確切名稱進行顯式呼叫。如果您希望截斷或刪除一個分割槽,可以呼叫這個擴充套件的分段語法。

以此方式建立表之後,DBA_PART_TABLES 檢視中的 PARTITIONING_TYPE 列會顯示時間間隔。

系統分割槽


儘管 Oracle 對此特性的實際用途期望很少,但我還是希望至少描述一下此特性,因為它真的很酷。

下面是一個很少見但並非不可能發生的用例:假設您有一個無法用任何邏輯方法分割槽的表。結果將是一個巨大的、單一的表,這會導致需要擴充套件的索引維護和其他操作等問題。

因此,開發人員提出一個解決方案:他們承諾,如果該表不能以某種方式分割槽,他們可以通過一種智慧方式寫入分割槽。這樣,應用程式就可以控制特定記錄進入哪個分割槽。DBA 只需定義分割槽。示例如下:

create table sales3

(

   sales_id   number,

   product_code number,

   state_code   number

)

partition by system

(

   partition p1 tablespace users,

   partition p2 tablespace users

);

注意,沒有任何分割槽鍵或邊界。因此,以物理方式將表分成兩個段,但仍然是一個邏輯表。以這種方式定義之後,資料庫會為該表建立兩個段,而不是隻有一個單一的表。您可以通過以下語句對其進行檢查:

SQL> select partition_name

  2  from user_segments

  3  where segment_name = 'SALES3';

 

PARTITION_NAME

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

P1

P2

建立本地索引時,也是以相同的方式對其進行分割槽。

SQL> create index in_sales3_state on sales3 (state_code) local;

 

Index created.

 

SQL> select partition_name

  2  from user_segments

  3  where segment_name = 'IN_SALES3_STATE';

 

PARTITION_NAME

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

P1

P2

可以通過檢查 user_part_tables 來檢查分割槽的型別:

SQL> select partitioning_type

  2  from user_part_tables

  3  where table_name = 'SALES3';

 

PARTITION

---------

SYSTEM

這顯示為 SYSTEM,當然,指示系統分割槽。需要注意的一點是,這些表型別的 high_value 列值為空。

SQL> select partition_name, high_value

  2  from user_tab_partitions

  3  where table_name = 'SALES3';

 

PARTITION_NAME HIGH_VALUE

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

P1              

P2

下面是一個有趣的問題:如果沒有分割槽鍵或方案(如範圍、列表或雜湊),Oracle 如何知道傳入的記錄應進入哪個分割槽?

答案是:Oracle 不知道。下面的示例顯示瞭如果您向表中插入一條記錄時將發生的情況:

SQL> insert into sales3 values (1,101,1);

insert into sales3 values (1,101,1)

            *

ERROR at line 1:

ORA-14701: partition-extended name or bind variable must be used for DMLs on

tables partitioned by the System method

分割槽邊界是未知的,因此應用程式必須在插入資料的同時使用分割槽敏感語法來提供該資訊。您需要將該語句重新編寫為:

SQL> insert into sales3 partition (p1) values (1,101,1);

 

1 row created.

刪除時,您不必提供分割槽敏感語法,但是記住,沒有分割槽邊界的概念。因此,當您發出如下語句時:

SQL> delete sales3 where state_code = 1;

Oracle 必須掃描所有分割槽,以檢視該行所在的位置。為了避免出現這種情況,您應將其重新編寫為:

SQL> delete sales3 partition (p1) where state_code = 1;

更新也是一樣的。這限制了搜尋該記錄的分割槽範圍。

如果一個表不能以任何邏輯方式進行分割槽,那麼系統分割槽將提供驚人的優勢。它們使您能夠利用分割槽的優勢,同時允許開發人員自由決定記錄將進入哪個分割槽。

單個分割槽的表空間傳輸


Oracle 資料庫的早期版本中,您能夠傳輸表空間,並且稍後能將其插入不同資料庫或同一個資料庫中。該過程涉及複製資料檔案,因此它是跨資料庫傳輸資料的最快方法。然而直到現在,您仍然無法傳輸單個分割槽的表空間,然後再將其插回資料庫中。在 Oracle 資料庫 11g 中,您可以這麼做。

假設您有一個名為 SALES5 的表,它包括了幾個名為 CTNY 等的分割槽。

SQL> select partition_name, tablespace_name

  2  from user_tab_partitions

  3  where table_name = 'SALES5';

 

PARTITION_NAME TABLESPACE_NAME

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

CT             TS1

NY             TS2

現在,您可以使用如下命令傳輸 CT 分割槽: $ expdp tables=scott.sales5:ct transportable=always directory=data_pump_dir dumpfile=p_ct.dmp Export:Release 11.1.0.4.0 - Beta on Sunday, 10 June, 2007 16:05:40 Copyright (c) 2003, 2005, Oracle.All rights reserved. Username:/ as sysdba

Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.4.0 - Beta

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Oracle Database Vault options

Starting "SYS"."SYS_EXPORT_TABLE_01":  /******** AS SYSDBA tables=scott.sales5:ct transportable=

  always directory=data_pump_dir dumpfile=p_ct.dmp

Processing object type TABLE_EXPORT/TABLE/PLUGTS_BLK

Processing object type TABLE_EXPORT/TABLE/TABLE

Processing object type TABLE_EXPORT/TABLE/END_PLUGTS_BLK

Master table "SYS"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded

****************************************************************************

Dump file set for SYS.SYS_EXPORT_TABLE_01 is:

  /home/oracle/oracle/admin/PROBE2/dpdump/p_ct.dmp

******************************************************************************

Datafiles required for transportable tablespace TS1:

  /home/oracle/oradata/PROBE2/PROBE2/ts1_01.dbf

Job "SYS"."SYS_EXPORT_TABLE_01" successfully completed at 16:05:55

現在,可以將 p_ct.dmp ts1_01.dmp 這兩個檔案傳遞到其他系統,然後嘗試將其插入到資料庫中。出於學習目的,我們嘗試插入到相同的資料庫中。首先,您需要刪除該表,然後刪除 ts1 表空間。

SQL> drop table scott.sales5;

 

Table dropped.

 

SQL> drop tablespace ts1 including contents;

 

Tablespace dropped.

現在,將表空間插入到資料庫中。但這裡有個小問題:sales5 表不再存在,您最初只匯出了一個分割槽 (ct),並未匯出整個表。那麼如何只匯入不存在的表的一個分割槽呢?

Oracle 資料庫 11g 中,Data Pump 匯入中的一個名為 partition_options 的新命令列選項可實現此操作。如果您指定了值 departitionData Pump 將根據匯出的分割槽建立一個新表。該方法以這種方式拆分分割槽,因此它相應地被命名為取消分割槽。我們來看一下它的工作原理。

$ impdp partition_options=departition dumpfile=p_ct.dmp

   transport_datafiles='/home/oracle/oradata/PROBE2/PROBE2

/ts1_01.dbf'

 

Import: Release 11.1.0.4.0 - Beta on Sunday, 10 June, 2007 21:58:08

 

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

 

Username: / as sysdba

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.4.0 - Beta

With the Partitioning, Oracle Label Security, OLAP, Data Mining

and Oracle Database Vault options

Master table "SYS"."SYS_IMPORT_TRANSPORTABLE_04" successfully loaded/unloaded

Starting "SYS"."SYS_IMPORT_TRANSPORTABLE_04":  /******** AS SYSDBA partition_options=

   departition dumpfile=p_ct.dmp transport_datafiles=/home/oracle/oradata/PROBE2/PROBE2/ts1_01.dbf

Processing object type TABLE_EXPORT/TABLE/PLUGTS_BLK

Processing object type TABLE_EXPORT/TABLE/TABLE

Processing object type TABLE_EXPORT/TABLE/END_PLUGTS_BLK

Job "SYS"."SYS_IMPORT_TRANSPORTABLE_04" successfully completed at 21:58:23

SQL 建立了一個名為 sales5_ct 的表,這個表只是由先前可傳輸的表空間匯出的 SALES5 表的 ct 分割槽。如您所見,表名是原始表名和分割槽名的組合。可以通過檢查 DBA_SEGMENTS 檢視來確認段的存在。

SQL> select segment_name

  2  from dba_segments

  3  where tablespace_name = 'TS1';

 

SEGMENT_NAME

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

SALES5_CT

您可以使用單個分割槽的可傳輸表空間特性將一個表的單個分割槽插入到其他資料庫中。插入之後,您可能希望執行交換分割槽操作,以便將其作為一個分割槽置於某個表上。

根據虛擬列分割槽


我們來看另一個常見問題。在名為 sales 的表中,您具有以下列:

SQL> desc sales

 Name                                      Null?    Type

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

 SALES_ID                                  NOT NULL NUMBER

 CUST_ID                                   NOT NULL NUMBER

 SALES_AMT                                          NUMBER

假設您希望按照某個允許您進行清除的方案對該表進行分割槽,並且基於銷售額進行存檔。以下是銷售的四個類別:

如果 sale_amt

cust_id

sale_category

0-10000

任何內容

LOW

10001-100000

0-100

LOW

10001-100000

101-200

MEDIUM

10001-100000

>200

HIGH

100001-1000000

0-100

MEDIUM

100001-1000000

101-200

HIGH

100001-1000000

>200

ULTRA

>1000000

任何內容

ULTRA

您希望根據 sale_category 列對該表進行分割槽,但有一個問題:沒有名為 sale_category 的列。這是您從 sale_amt 列派生的列。那麼您如何對該表進行分割槽呢?

Oracle 的早期版本中,您可能已經在表中插入了名為 sale_category 的新列,並使用一個觸發器用表中所示的邏輯填充該列。但是由於觸發器,這個新列的存在可能會導致其他效能影響。

Oracle 資料庫 11g 中,一個稱為虛擬列的新特性使您能夠建立一個並不儲存在表中的列,但在執行時將計算該列。您還可以根據該列進行分割槽。使用此特性,對該表進行分割槽就變得輕而易舉。

create table sales

(

   sales_id      number,

   cust_id       number,

   sales_amt     number,

   sale_category varchar2(6)

   generated always as

   (

      case

         when sales_amt <= 10000

            then 'LOW'

         when sales_amt > 10000

            and sales_amt <= 100000

            then case

               when cust_id < 101 then 'LOW'

               when cust_id between 101 and 200 then 'MEDIUM'

               else 'MEDIUM'

            end

         when sales_amt > 100000

            and sales_amt <= 1000000

            then case

               when cust_id < 101 then 'MEDIUM'

               when cust_id between 101 and 200 then 'HIGH'

               else 'ULTRA'

            end

         else 'ULTRA'

      end

    ) virtual

)

partition by list (sale_category)

(

   partition p_low values ('LOW'),

   partition p_medium values ('MEDIUM'),

   partition p_high values ('HIGH'),

   partition p_ultra values ('ULTRA')

)

現在,如果您插入以下行:

SQL> insert into sales (sales_id,cust_id,sales_amt) values (1,1,100);

 

1 row created.

 

SQL> insert into sales (sales_id,cust_id,sales_amt) values (2,1,1500);

 

1 row created.

 

SQL> insert into sales (sales_id,cust_id,sales_amt) values (3,102,1500);

 

1 row created.

 

SQL> insert into sales (sales_id,cust_id,sales_amt) values (4,102,10000);

 

1 row created.

 

SQL> commit;

 

Commit complete.

注意,您未輸入 sale_category 的值。現在,如果您檢查 p_low 中的記錄,將看到正確的記錄:

SQL> select * from sales partition (p_low);

 

  SALES_ID    CUST_ID  SALES_AMT SALE_C

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

         1          1        100 LOW

該記錄放在相應的分割槽中。

根據虛擬列分割槽使您能夠建立對業務重要的分割槽,即使列本身是不存在的。這裡,您已經對虛擬列使用了一個非常簡單的計算方法,但它也可以如您希望的那樣複雜。在這些情況下,根據虛擬列進行分割槽將變得更有價值。

Partition Advisor


在設計分割槽方案的過程中,您考慮的最主要的問題可能是選擇分割槽方案和分割槽列的決定。這個任務最好留給進行廣泛工作負載分析的經驗豐富的專業人員,即使是他們可能也無法做出正確的決定。您可以在 Oracle 資料庫 11g 中通過一個名為 Partition Advisor 的新顧問工具獲得幫助,該工具可以分析資料、訪問模式並建議分析方案。您可以在這一部分中瞭解有關該工具的更多資訊。

結論


分割槽一直是 Oracle 資料庫 11g 中最有用的工具之一,它將變得越來越有用:

  • 引用分割槽允許您對同一資料庫中的相關表進行均值分割槽,即使所有子表中都不存在相應的列。
  • 間隔分割槽包括了非常有用的即發即棄功能您定義一個時間間隔,Oracle 會永遠進行維護。
  • 將組合分割槽擴充套件到範圍-範圍、列表-範圍、列表-雜湊和列表-列表可以提供更好的分割槽選擇以及可管理性。
  • Data Pump 現在允許您傳輸和插入單個分割槽,該特性在存檔和保留方面肯定非常有用。
  • 最後,您可以設計最可能的分割槽策略,通過根據虛擬列進行分割槽來模擬業務流。

分而治之的策略從未提供過如此多的選擇。可以將它們設想為另一套可以割下火雞身上最好部分的鋒利刀子!

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

相關文章