|
|
看到这个帖子,忽然想到一个数据维护顺序的问题,总的来说,我觉得可能存在三种维护顺序:
1.先维护表数据,再维护索引数据;
2.先维护索引数据,再维护表数据;
3.前两者的结合。
对于
2、循环删除(使用索引):
SQL> begin
2 for v in (select name from testp) loop
3 delete from testc where name = v.name;
4 end loop;
5 commit;
6 end;
7 /
如果是第二种方案的话,这里先使用索引找到name=:1的索引项,一项一项的删除索引条目的同时通过rowid找到表数据项,删除这些表数据项,这样当clustering_factor很大的时候,表数据维护的逻辑IO可能会很大,因为对于同一个name来说,同一个数据块可能会被多次读取(一个索引的叶块上,会按照rowid排序吗?如果会按照rowid排序的话,对于同一个name来说,同一个数据块也只会被读取一次,但我觉得应该不是按照rowid排序的.是吗?望高人给出见解),但可以使用表预取技术,先取得rowid list,排序后,再去维护表数据,这样对于同一个name来说,同一个数据块只会被读取一次。
对于
1、直接删除:
SQL> delete from testc;
如果是第一种方案的话,根据表数据项如何找到对应的索引项呢?
索引条目里记录着rowid,可以很容易的找到对应的表数据项,
但反过来,一个数据项对应的索引项该如何找到呢?
比如说删除的这行数据name='z' rowid='xxxxxxxx';
把name='z'作为一个access predicateslai定位索引项目,然后把rowid='xxxxxxxx'作为一个filter predicates来定位最终要删除的索引条目,但感觉这样做效率也太低了吧?!
当然,上面说得有点儿乱,不知道大家怎么看这个问题. |
|