日期:2014-05-17  浏览次数:20908 次

UPDATE 语句执行效率问题
在一个ASP程序中要更新一个表t,大概有20万条数据需要更新,总数据量在100W以上。在更新的时候,需要到另外一个表中c检索与t.a,t.b相匹配的字段。
现有的查询逻辑是
UPDATE   t   SET   ....   WHERE   t.A   ||   t.B   IN   (SELECT   c.a   ||   c.b   from   c   where   c.ym= '200706 ')

这个对c表的子查询大概能检索出150-200条记录。

这个代码在开发环境下没有问题,但是这样在客户的测试服务器上出现ORA-01013错误。有没有好地解决办法?这个系统规定不能用任何存储过程,触发器,视图等。当然更不可能更改数据库的任何参数。

请大家提供思路,尤其是做过ASP对大数据量处理的朋友。谢谢。



------解决方案--------------------
UPDATE t SET (col1,col2)=
(select c.col1,c.col2 from c where c.a=t.a and c.b=t.b and c.ym= '200706 ')

------解决方案--------------------
ls的方法不错阿
------解决方案--------------------
UPDATE t SET .... WHERE t.A || t.B IN (SELECT c.a || c.b from c where c.ym= '200706 ')

需要看C表中的数据量大小的...

如果很大的话,最好使用 exits操作
------解决方案--------------------
WHERE t.A || t.B IN (SELECT c.a || c.b from c where c.ym= '200706 ')
这样用效率非常低,强烈不推荐(不仅索引不起作用,还要把所有记录的A,B进行连接运算)
本人认为应该这样

UPDATE t SET
...
WHERE
Exists(select a from c where c.ym= '200706 ' and t.A=c.a and t.B=c.b)
------解决方案--------------------
就用lixin5678(li) 的方法