【新炬網路名師大講堂】Oracle 12C一個實用的新特性介紹:drop/truncate多個子分割槽

shsnchyw發表於2014-12-10

        今年年初時候,局方人員反應資料網管系統WAP話單報表查詢非常緩慢,經我們分析了下,發現是由於業務表查詢條件沒有建索引導致全表掃描。該表是一個大分割槽表,大約有350G的資料量,按每小時進行分割槽,保留了大概一個星期多的歷史記錄,經和局方、開發商一起商量後,決定清理掉一部分沒用的資料,以方便新建索引,減少影響業務的時間。於是就寫了個指令碼,裡面的

        大概內容就是:

        ALTER TABLE ULTRANMS.UC_WAP_PULL_QUERYLOG TRUNCATE PARTITION P_20121231000000;
        ALTER TABLE ULTRANMS.UC_WAP_PULL_QUERYLOG TRUNCATE PARTITION P_20121231010000;
        ……
        ALTER TABLE ULTRANMS.UC_WAP_PULL_QUERYLOG TRUNCATE PARTITION P_20130104220000;

        一共需要TRUNCATE掉119個子分割槽,由於每執行一個SQL語句就需要經歷語法語義檢查、編譯生成執行計劃消耗一些系統資源,所以連續執行這119個SQL語句對資料庫的效能是一個不小的衝擊,記得當時就在想:Oracle對這種大批次操作怎麼就沒有搞出一種高效的方法呢。

        在參加OOW介紹新特性的時候發現,Oracle 12C已經可以實現使用單獨一條SQL語句對子分割槽進行維護操作了。
        例如range_sales表有7個子分割槽,
        CREATE TABLE range_sales
        ( prod_id NUMBER(6)
        , cust_id NUMBER
        , time_id DATE
        , quantity_sold NUMBER(3)
        , amount_sold NUMBER(10,2)
         )
        PARTITION BY RANGE (time_id)
        (PARTITION SALES_Q2_2011 VALUES LESS THAN (TO_DATE(’01-APR-2011′,’DD-MON-YYYY’)),
         PARTITION SALES_Q3_2011 VALUES LESS THAN (TO_DATE(’01-OCT-2011′,’DD-MON-YYYY’)),
         PARTITION SALES_Q4_2011 VALUES LESS THAN (TO_DATE(’01-JAN-2012′,’DD-MON-YYYY’)),
         PARTITION SALES_Q1_2012 VALUES LESS THAN (TO_DATE(’01-APR-2012′,’DD-MON-YYYY’)),
         PARTITION SALES_Q2_2012 VALUES LESS THAN (TO_DATE(’01-JUL-2012′,’DD-MON-YYYY’)),
         PARTITION SALES_Q3_2012 VALUES LESS THAN (TO_DATE(’01-OCT-2012′,’DD-MON-YYYY’)),
         PARTITION SALES_Q4_2012 VALUES LESS THAN (MAXVALUE));

        現在需要對SALES_Q2_2011, SALES_Q3_2011, SALES_Q4_2011這3個子分割槽進行TRUNCATE操作,可以直接在一條SQL語句中單獨實現:
        ALTER TABLE range_sales TRUNCATE PARTITIONS SALES_Q2_2011, SALES_Q3_2011, SALES_Q4_2011;
        新特性固然好,但是也需要慎重考慮做足測試功夫才行,如對上述資料網管大分割槽表是在12C資料庫中進行操作的時候,可以考慮嘗試在一條單獨的SQL語句中進行小批次進行,如每條SQL語句TRUNCATE 20個子分割槽表,防止如此大的DDL操作過程導致資料庫出現問題等。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29960155/viewspace-1363548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章