Oracle分區表,哈希分區的新建與增加


一、背景知識

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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM