通過分割槽進行優化(轉)
“分而治之”— 沒有能夠比 Oracle 資料庫的分割槽特性更好地闡釋這個象徵性原則的了。從版本 8 開始,您就可以將一個表或索引劃分成多個段,然後將它們放在不同的表空間內。該表仍作為一個邏輯實體定址,各個分割槽則儲存為單獨的段,這就簡化了資料操作。
在版本 11 中,引用分割槽、間隔分割槽、虛擬列分割槽以及擴充套件的組合分割槽等增強功能支援無限的分割槽設計可能性,並提高了可管理性。
如果您希望在分割槽的基礎以及對您選擇分割槽列或方案的決定有影響的因素上進一步提高,請參閱《Oracle Magazine》2006 年 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)
該子句以迴圈方式將分割槽儲存在表空間 TS1、TS2 和 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 的表,它包括了幾個名為 CT、NY 等的分割槽。
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 的新命令列選項可實現此操作。如果您指定了值 departition,Data 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 進行表分割槽MySql
- Linux系統如何進行分割槽?swap分割槽是什麼?Linux
- 『學了就忘』Linux檔案系統管理 — 67、通過命令模式進行LVM分割槽Linux模式LVM
- linux掛載新硬碟並進行分割槽格式化Linux硬碟
- 非分割槽錶轉換成分割槽表
- Linux下進行格式化行動硬碟(U盤)以及分割槽Linux硬碟
- 『學了就忘』Linux檔案系統管理 — 66、通過圖形介面進行LVM分割槽LinuxLVM
- PG的非分割槽表線上轉分割槽表
- win10怎麼快速給磁碟分割槽_win10如何進行磁碟分割槽Win10
- 記一次分割槽表update調優過程
- kafka指定key進行分割槽遇到的問題Kafka
- 用GParted給linux系統進行磁碟分割槽?Linux
- 非分割槽錶轉換成分割槽表以及注意事項
- SQL優化案例-分割槽索引之無字首索引(六)SQL優化索引
- Oracle優化案例-分割槽索引之無字首索引(六)Oracle優化索引
- MySQL調優之分割槽表MySql
- DiskGenius分割槽行動硬碟硬碟
- Oracle SQL調優之分割槽表OracleSQL
- 通過串列埠進行通訊 :串列埠
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- Linux 分割槽和格式化Linux
- 對一條基於分割槽的簡單SQL的優化SQL優化
- Oracle drop分割槽表單個分割槽無法透過閃回恢復Oracle
- Linux分割槽方案、分割槽建議Linux
- Oracle 12C新特性-線上把非分割槽錶轉為分割槽表Oracle
- thinkpad自帶win10系統怎麼進行分割槽 thinkpad電腦win10系統如何分割槽ThinkPadWin10
- MySQL線上轉分割槽表(以及TiDB)MySqlTiDB
- oracle分割槽表和分割槽表exchangeOracle
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- Linux 分割槽擴容(根分割槽擴容,SWAP 分割槽擴容,掛載新分割槽為目錄)Linux
- 通過qq進行ip定位
- 通過熱力圖、A/B測試優化落地頁,提升200%轉化率!優化
- Oracle分割槽表基礎運維-07增加分割槽(2 HASH分割槽)Oracle運維
- oracle分割槽表和非分割槽表exchangeOracle
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- 通過新增條件優化SQL優化SQL
- PostgreSQL11preview-索引優化。filter智慧消除、分割槽索引智慧合併SQLView索引優化Filter
- 分割槽函式partition by的基本用法【轉載】函式
- WINDOWS還原系統後原多個分割槽合併為一個分割槽後怎麼進行資料恢復Windows資料恢復