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语句都在十分之一秒之内就可以完成。



oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html