Oracle function-based index对于数据更新处理延时问题。
新鲜鱼排 2007-06-11 01:53:38 问题描述:根据tableA中Col2列数据对其他数据表进行更新,并且把Col2输具由0变成1。为了提高查询速度将数据表tableA中Col2使用了function-based index,现在使用嵌套游标来更新Col2的数据,并且为了提高执行速度使用两个程序来更新数据。偶尔会出现对其它数据表进行两次更新的情况,分析可能是由于多个程序调用的原因,使用了10个Server同时调用,结果出现问题的几率达到了25%。下面介绍一下具体的代码。
由于不能贴图,我将问题发在Blog上,
http://blog.csdn.net/dutguoyi/archive/2007/06/09/1645762.aspx
数据表tableA,数据结构如下:
Col1 Col2
Aa 0
Bb 1
Cc 1
步骤:
1. 建立Cur1
CURSOR cur1
IS
SELECT Col1 FROM tableA WHERE CEIL (col2) = 0 ORDER BY col3;
2. 建立Cur2
CURSOR cur2
IS
SELECT 一些数据(不列举了) FROM tableA WHERE col2 = 0 AND Col1 = 由Cur1中Col1变量得到的值 ORDER BY col3 FOR UPDATE SKIP LOCKED;
3. Cur1中嵌套Cur2
FETCH cur2 INTO 由Cur1中Col1变量得到的值;
FOR cur_row IN cur2 LOOP
UPDATE tableA SET col2 = 1 WHERE col1 = parameter_col1;
p_count := p_count + 1;
COMMIT
END LOOP;
为了更好的提高查询速度针对Col2列建立了一个function based index,建立的方法如下。Col2列的数据只有1和0两种数据,而且主要是1。
Cur1主要是获取到需要处理的数据。
Cur2主要是获取每一条数据,由于多个程序的调用,所以Cur1中的过滤条件也加了进去,因为某一条数据在一个程序循环过程中可能被另外一个程序执行结束。FOR UPDATE SKIP LOCKED语句的作用是对于数据表更新操作的锁定。
原因分析:可能是function-based index的数据更新有延迟问题,一条已经处理结束的数据状态仍然没有变换为1,导致另外一个程序查询到这条数据然后又进行了一次更新。
解决方案:去掉function-based index。
不知道function-based index是否是这个问题的原因,请解决过类似问题的兄弟多多指点。非常感谢。
参考资料;
Creating a Function-Based Index
http://www.lc.leidenuniv.nl/awcourse/oracle/server.920/a96521/indexes.htm#2943