表中可以允許的最大分區數是多少,以前並沒有太在意過。如果不查文檔,有沒有快速的方法來得到結果呢。
當時手工是11.2的環境,於是首先想到了INTERVAL分區,這樣只需要建立一個INTERVAL為1的分區表,並不停的插入資料,Oracle會自動擴充分區,只到分區上限Oracle會報錯。
但是發現這種方法不但耗時很長,而且存在bug,Oracle頻繁通過遞迴調用來建立分區,很快就會導致系統記憶體耗盡,6G的記憶體幾乎都被共用池佔用,系統出現ORA-4031錯誤。而這時僅僅建立了不到10000個分區。
而利用RANGE分區,可以輕鬆的ADD PARTITION到20000,也不會造成錯誤。
那麼除了RANGE分區是不是就沒有其他更好的方法呢,其實利用HASH分區可以更快的獲得這個問題的答案。
如果使用11.2的新特性,根本不需要真正執行建立:
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database11gEnterprise Edition Release11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> CREATE TABLE T_PART_HASH
&2 (ID NUMBER)
&3 SEGMENT CREATION DEFERRED
&4 PARTITION BY HASH (ID)
&5 PARTITIONS 1048576;
PARTITIONS 1048576
*
第5行出現錯誤:
ORA-14299:分區/子分區的總數超過了最大限制
SQL> CREATE TABLE T_PART_HASH
&2 (ID NUMBER)
&3 SEGMENT CREATION DEFERRED
&4 PARTITION BY HASH (ID)
&5 PARTITIONS 1048575;
CREATE TABLE T_PART_HASH
*
第1行出現錯誤:
ORA-14223:此表不支援延遲建立段
根據錯誤資訊的不同,就可以確定,Oracle所支援的最大分區數就是1048575,也就是POWER(2, 20) – 1。
當然如果是其他版本,也可以得到相似的結果,區別在於由於不指定SEGMENT CREATION DEFERRED,那麼對於後面那個建立分區表的語句,會開始執行。
而這個執行時間如果不是由於資源不足而報錯的話,那麼可能至少需要幾天的時間,因此確認命令可以執行後,應儘快中止會話。另外不要在任何正式環境執行上面的SQL。
本欄目更多精彩內容:http://www.bianceng.cn/database/Oracle/