一、背景知識
Oralce中的一張表數據量達到億數量級后或是單表達到2G大小,查詢效率似乎會明顯下降。需要通過分區的方式,從行的維度對表進行划分,避免單表數據量過大
分區方法有下面幾類:
- 范圍,最常見,按照某列數據的范圍分區,比如按時間分區
- 哈希,對於數據規律性不強,或者取值范圍難以確定的,推薦哈希法,強行進行分區。分區個數需設置成2的冪次
- 列表,類似枚舉,需事先知道字段的精確值
- 混合,上述各種組合
oracle 11g又新增了幾種分區方法,如下:
- 引用分區,父表的外鍵作為關鍵字建立分區,則子表可以以同樣的方式分區
- 虛擬列分區,通過表中字段的運算結果進行分區
- 間隔分區,范圍分區的變種,范圍固定且分區可自動擴展
- 系統分區,insert和select時,全完手工指定分區
參考資料:http://space.itpub.net/7607759/viewspace-260278
http://tech.it168.com/db/2008-03-24/200803241734089.shtml
二、新建分區
這里就寫下在線重定義的方法,離線的就不寫了。
1.新建一張表
CREATE TABLE T_HASH (ID NUMBER PRIMARY KEY, TIME DATE);
2.往里面插測試數據
3.測試權限
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(userName, 'T_HASH', DBMS_REDEFINITION.CONS_USE_PK);
如果提示沒有權限,通過dba賬戶添加當前賬戶權限,或者直接用dba賬戶操作
4.建一個與原表結構一樣的臨時表,需在臨時表建分區
CREATE TABLE T_TMP (ID NUMBER PRIMARY KEY, TIME DATE) partition by hash (ID) ( partition p1 tablespace spaceName, partition p2 tablespace spaceName, );
5. 在線重定義
表的在線重定義
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(userName, 'T_HASH', 'T_TMP');
數據同步,保證操作過程中,臨時表和原表的數據一致性
execute dbms_redefinition.sync_interim_table(userName,'T_HASH','T_TMP');
執行結束
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(userName, 'T_HASH', 'T_TMP');
6.檢查結果
SELECT COUNT(1) FROM T_HASH; SELECT COUNT(1) FROM T_HASH PARTITION (P1); SELECT COUNT(1) FROM T_HASH PARTITION (P2);
7.刪除臨時表
參考資料:http://www.blogjava.net/willpower88/archive/2007/04/19/111987.html
三、增加分區
對於哈希分區,一條SQL搞定:
ALTER TABLE tableName ADD PARTITION partitionName;