概述
网上看到,参考一下,未什么他说能快那么多
http://mycopy.blog.sohu.com/89081648.html
遇到一个sql运行很慢:
update tablea set cola = ( select sum(colb) from tableb where a.col1=b.col1);
其 中tablea有1千万条记录,tableb有4千万条记录。update语句没有过滤条件,这意味着要对tablea表的1千万条记录都要遍历一遍,而 且每一条都要查询4千万的表。这样的操作肯定会历经很长的时间并且消耗很多服务器的资源。实际运行了差不多10个小时,这是无法接受的。
update tablea set cola = ( select sum(colb) from tableb where a.col1=b.col1);
其 中tablea有1千万条记录,tableb有4千万条记录。update语句没有过滤条件,这意味着要对tablea表的1千万条记录都要遍历一遍,而 且每一条都要查询4千万的表。这样的操作肯定会历经很长的时间并且消耗很多服务器的资源。实际运行了差不多10个小时,这是无法接受的。
考虑改写这个sql:
这个sql慢就慢在每个记录都要查询另一个表,要用别的方式避免这种处理。
第一步:先建一个临时表,与tablea的结构是完全一样的,这里注意要建成session级的临时表,使临时表的数据可以在session级保留。
create temporary table temp_a as select * from tablea where 1=2 on commit preserve rows;
第二步:这里假设tablea只有2个字段:cola 和 col1
insert into temp_a
select a.col1,b.sum_b
from tablea a,
(select col1,sum(colb) sum_b
from tableb
group by col1) b
where a.col1 = b.col1;
第三步:将tablea表truncate掉,然后将temp_a表的数据insert回来。
truncate table tablea;
insert into tablea select * from temp_a;
这样改写后,7分钟就运行完成了
最后
以上就是老迟到西装为你收集整理的利用insert select 替代update以提升性能 分享的全部内容,希望文章能够帮你解决利用insert select 替代update以提升性能 分享所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复