最近见到一条开发人员写的UPDATE语句, 觉得没什么不对, 可又觉得有地方不对, 因为性能低下.
UPDATE A SET
(COL2, COL3) = (SELECT COL1,'T'
FROM B WHERE B.COL1=A.COL1)
WHERE EXISTS
(SELECT B.COL1 FROM B WHERE B.COL1=A.COL1)
也就更新几十万条记录, 没这么慢的啊. 最后发现这个SQL语句可以简化为如下.
UPDATE A SET COL2=COL1, COL3='T'
WHERE EXISTS
(SELECT B.COL1 FROM B WHERE B.COL1=A.COL1)
说明还有很多可以提高的地方.
留言 (4)
刚好这个语句比较特别,如果不是col2=col1的话,也就是刚好2张都有col1字段,而且都相等。如果需要a.col2=b.col3的话,下面的方式就不行了。
Posted by oliver | Jun 26, 2008 11:27 AM
我也举例子
一共有三个表:A、B、C
我看到开发人员是这样来做的
select count(*) from A,B,C
where A.id=B.id
and B.other_id=C.id(+);
这里就多了一个右连接,其实和这样结果是一样的
select count(*) from A,B
where A.id=B.id
主要是求count(*)
Posted by stronghearted | Jul 9, 2008 3:35 PM
楼上的例子不错,SQL Tuning就是这样开始的。
Posted by anysql | Jul 10, 2008 6:46 PM
UPDATE A SET COL2=COL1, COL3='T'
WHERE EXISTS
(SELECT B.COL1 FROM B WHERE B.COL1=A.COL1)
SET COL2=COL1这个COL1是A表的还是B表的列?
Posted by overmars | Aug 21, 2008 12:13 PM