今年年初时候,局方人员反应数据网管系统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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29960155/viewspace-1363548/