优化sql感悟

来源:互联网 发布:mac 截屏快捷键 编辑:程序博客网 时间:2024/05/19 12:24

       最近一直在做报表的优化,领导的一句话让我很有感悟,报表工具其实就是把数据读取出来,读取什么就是什么,不要有过多的操作,这就是经验啊。我想到了我以前坐这个报表的时候(由于逻辑太复杂了,涉及到整个ERP项目的数据)每个单元格一个sql,而且还要加很多的过滤,重复的放在一起,只是过滤不一样,将近160个sql,不算过滤条件,放在报表里面运行,呵呵,结果你们知道的,测试受不了了,其实我也受不了了。但是当时没有想出来怎么去优化,实在是不知道怎么优化。后来想到建张临时表,使用存储过程生成数据,然后前几点击按钮,后台调用存储过程往临时表里插入数据,还是由于逻辑太复杂,复杂的让我自己都受不了,加班加点的干了将近一个多星期把存储过程写好了,又加班加点的核对生成的数据对不对,期间又过去了两个星期,种种痛苦不必明说,你能想到的多痛苦我当时就有多痛苦,各方面的压力接踵而来。讲偏了,闲言碎语不要讲了,回归正题。费了九牛二虎之力把存储过程弄好了,报表的数据也核对好了,可以正常的跑起来了,但是这个只是但是,还有一个问题出现了,点击按钮调用存储过程的时候执行的逻辑太复杂,造成数据慢慢的在那里跑啊跑,最长时间是6分多钟才可以生成好,造成连接桥都断了,客户受不了了,测试也受不了了,同事也受不了了,我也受不了了,接着改,就去优化,一个工作几年的研究生同事看了我的存储过程说:你这又很多的for循环+select语句你不觉的每次循环一下就会很慢吗?一语点破梦中人,是的呀,这会造成慢,她说你把数据取出来然后分组,把数据放到一个类似于hashmap里面(其实就是Oracle的RECORD记录),for只负责读取map里面的值,不负责select数据,select在加载的时候就分组成功了,这样就会读取数据很快,由于我不知道怎么做,她给了我一个demo,一下就明白了,说干就干起来,存储过程太多(逻辑太复杂),她也帮我改了几个,非常感谢她帮我的忙,剩下的我都在改,期间有一天有事情没有改,周一回来一直弄到现在是好了,刚才测试了一把,尼玛,结果令我大跌眼镜,8秒搞定了,可能是因为数据太少的原因(以前的存储过程在正式环境下跑的,我测试的不能动正式库的数据,只能在另一个环境测试,造成数据会少),我的下巴都惊掉了,这样太快了,我再次相信了我是比较笨的人。笨人总要去总结过去,总结失误,这个报表给我的感悟就是for循环里面不准放select语句,可以根据某一个分组放到一个类似于hashmap里面然后就可以在for里面直接的取数据就ok了,这回很高的提升速度。


有问题或指正请联系:chenshoulu@wsdinfo.com  谢谢!

0 0
原创粉丝点击