LIST分区表的分区键值是离散的值,因此具有和其他分区与众不同的DDL维护语句,ADD VALUES和DORP VALUES。
ADD VALUES和DROP VALUES分别为指定的分区增加或减少对应的分区键值。和ADD PARTITION以及DROP PARTITION不同,ADD PARTITION和DROP PARTITION是分区操作,分别新增分区和删除分区,而ADD VALUES和DROP VALUES是对已有的分区进行操作。
和其他DDL有所区别的时,即使并不涉及数据的修改ADD VALUES或DROP VALUES操作仍然可能会很慢,看一个例子:
SQL> CREATE TABLE T_PART_LIST 2 ( 3 OWNER VARCHAR2(30), 4 NAME VARCHAR2(30), 5 TABLESPACE_NAME VARCHAR2(30), 6 TYPE VARCHAR2(18) 7 ) 8 PARTITION BY LIST (TABLESPACE_NAME) 9 ( 10 PARTITION P1 VALUES ('SYSTEM'), 11 PARTITION P2 VALUES ('YANGTK'), 12 PARTITION P3 VALUES (DEFAULT) 13 ); 表已创建。 SQL> SELECT COUNT(*) 2 FROM DBA_SEGMENTS; COUNT(*) ---------- 5627 SQL> SELECT COUNT(*) 2 FROM DBA_SEQUENCES; COUNT(*) ---------- 224 SQL> INSERT INTO T_PART_LIST 2 SELECT A.OWNER, SEGMENT_NAME, TABLESPACE_NAME, SEGMENT_TYPE 3 FROM DBA_SEGMENTS A, DBA_SEQUENCES; 已创建1260448行。 SQL> COMMIT; 提交完成。
复制
构建了一个数据量比较大的表,下面对分区PARTITION P1执行ADD VALUES语句:
SQL> SET TIMING ON SQL> ALTER TABLE T_PART_LIST 2 MODIFY PARTITION P1 3 ADD VALUES ('JUST TEST'); 表已更改。 已用时间: 00: 00: 05.33 SQL> ALTER TABLE T_PART_LIST 2 MODIFY PARTITION P1 3 DROP VALUES ('JUST TEST'); 表已更改。 已用时间: 00: 00: 30.08
复制
没有涉及到任何数据的修改,只是修改数据字典,却导致ADD VALUES用了5秒的时间,而DROP VALUES更是用了半分钟。这是由于ADD VALUES和DROP VALUES执行的时候,Oracle要去查询DEFAULT对应的分区或进行操作的分区,检查需要新增或删除的列是否存在,因此对应的分区越大,这个DDL耗时就越长。
而最简单的优化的方法就是在分区列上建立索引:
SQL> CREATE INDEX IND_T_LIST_TBSSPC_NAME 2 ON T_PART_LIST(TABLESPACE_NAME); 索引已创建。 已用时间: 00: 00: 05.24 SQL> ALTER TABLE T_PART_LIST 2 MODIFY PARTITION P1 3 ADD VALUES ('JUST TEST'); 表已更改。 已用时间: 00: 00: 00.04 SQL> ALTER TABLE T_PART_LIST 2 MODIFY PARTITION P1 3 DROP VALUES ('JUST TEST'); 表已更改。 已用时间: 00: 00: 00.02
复制
可以看到,建立索引后,ADD VALUES和DROP VALUES语句都在十分之一秒之内就可以完成。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。