普通表自動轉化為按月分割槽表的指令碼
最近我們專案組遇到非常多張表需要改造為按月分割槽的分割槽表,而且有的表非常大,這個時候該如何做最快呢?
方法1
CREATE出所有的表,把原表TAB_OLD的建表指令碼拿出來,改改後,建出新的分割槽表的表結構,如TAB_NEW
然後把TAB_OLD INSERT INTO 到TAB_NEW中(考慮並行和NOLOGGING),然後把TABLE_OLD RENAME TABLE_BK,把TAB_NEW RENAME 為TAB_OLD
優點:由於新表是根據指令碼來建的,COMMENTS,DEFAULT值,PK,CHECK,NULL,外來鍵等屬性都是全的。
缺點1:找出所有的指令碼,然後手工把結構建出來,寫成分割槽表的動作步驟好繁瑣!這個問題視乎難以避免,其實不然。
缺點2:執行非常慢,因為INSERT INTO是最慢的,可能是噩夢
方法2
直接用CREATE TABLE TAB_NEW (PARTITION ....) AS SELECT * FROM TAB_OLD的方式(考慮並行和NOLOGGING)
優點:CTAS是最快的,比方法1的INSERT INTO快了許多倍!
缺點:由於新表是不是指令碼來建後,在從原表導資料的方案,COMMENTS,DEFAULT值,PK,CHECK,NULL,外來鍵等屬性都是沒有,
這些都需要手工來完成,如果涉及到幾十張的大表改造,將非常繁瑣,而且極容易因為疏忽而導致漏了將上面的屬性加進新表中。
方法3
仍然選擇CTAS的方式改造分割槽,兼顧了方法2的優點,只是這些新表的屬性利用ORACLE的資料字典獲取非手動來做,不再麻煩了,我們可以通過寫一個程式讀取各個資料字典的資訊來暗地裡悄悄的獲取到,把方法1的第1個缺點也避免了。
由此分析可以得知,方法3是同時擁有方法1和方法2的優點,而避免了他們的共同的缺點,在大量分割槽表改造的方案中,這個是最快的,其實即便只有一張表需要改造,用指令碼也是安全的。
下面來看看我寫的方法3的指令碼
(由於分割槽表改造後,索引涉及到是選擇LOCAL還是全域性的問題,還有就是索引是否是必須的問題,所以新表的索引我就不考慮自動建了,另外外來鍵由於涉及到依賴表必須存在,否則會出錯,為了安全起見,我外來鍵也不自動建了,另外外來鍵自動建的指令碼也比較難寫些,呵呵,還沒構造好,必要性不是太大,所以還沒認真投入)
CTAS後,我保證了tab comments ,col comments ,check,DEFAULT ,PK,null,這6大屬性一定必須要有!程式也考慮了NOLOGGING和PARALLEL最終轉化成普通的LOGGING和NOPARALLEL
暫時不提供自動有索引和REFERENCE,索引沒上面的關鍵,屬於更加枝節,而且是否是全域性索引還是區域性索引有待考察,而REFERENCE雖然重要,但是可能由於在改造中引用表還沒建好而報錯,因此這2大屬性,可以讓開發人員手工選擇性的最後判斷在上述都完成後,來決定新表如何增加
另:輸入的表名小寫皆可,程式碼中統一轉換為UPPER
【通用指令碼分享】普通表自動轉化為按月分割槽表的指令碼
http://www.itpub.net/thread-1349399-1-1.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/642366/viewspace-1067040/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 批次轉換分割槽表為普通表
- 批量轉換分割槽表為普通表
- 普通錶轉換為分割槽表
- 將普通錶轉換為分割槽表
- Oracle普通表修改為分割槽表的方法Oracle
- Oracle 將普通錶轉換為分割槽表Oracle
- 【分割槽】如何將一個普通錶轉換為分割槽表
- 實現MySQL表結構自動分割槽指令碼MySql指令碼
- ORACLE將普通錶轉變為分割槽表方法Oracle
- oracle9i 普通表改為分割槽表Oracle
- 利用dbms_redefinition實現普通heap表和分割槽表的轉化
- oracle 普通表-分割槽表改造流程Oracle
- Oracle線上將普通錶轉分割槽表Oracle
- 指令碼:線上重定義,從普通表到分割槽表,redefinition_table.sh指令碼
- 【轉載】linux自動分割槽指令碼Linux指令碼
- ORACLE普通錶轉換成分割槽表的操作Oracle
- 高手幫忙,超大普通錶轉分割槽表?
- ORACLE 線上重新定義表分割槽表重定義為普通表。Oracle
- 使用DBMS_REDEFINITION線上重定義表普通表為分割槽表
- Oracle Database將普通錶轉換為分割槽表遇到的問題OracleDatabase
- 將非分割槽錶轉換為分割槽表
- 使用ORACLE線上重定義將普通表改為分割槽表Oracle
- 普通錶轉換成分割槽表的四種方法
- 普通錶轉換分割槽表-線上重定義
- LightDB 22.4 新特性之相容Oracle線上轉換普通表為分割槽表Oracle
- 【Oracle】利用線上重定義的方式改變普通表為分割槽表Oracle
- 將mysql非分割槽錶轉換為分割槽表MySql
- oracle表分割槽詳解(按天、按月、按年等)Oracle
- 使用線上重定義方法改造普通表為分割槽表實戰
- 利用exp/imp變換普通表為分割槽表_10g_windowsWindows
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- 自動備份、截斷分割槽表分割槽資料
- 將一個非分割槽錶轉換為分割槽表
- 非分割槽錶轉換為分割槽表和partition indexIndex
- 線上重定義 ?普通錶轉換成分割槽表
- Oracle 12.2之後ALTER TABLE .. MODIFY轉換非分割槽表為分割槽表Oracle
- oracle將表配置為分割槽表Oracle
- ORACLE 普通錶轉換成分割槽表(線上重定義)Oracle