这几周一直在学习执行优化之类的问题,上午正好有机会和大家共享一下.
如题,近期做新作一个项目,有个CR是让对sql语句停止优化,提高运行效率。
具体的sql这里就不写了,因为不是本文要写的重点。这里用select * from dual来代替《这里认为是sql1》。
本以为是对这个sql停止优化就可以了,但是经过了两天修改,一无所得。
后来无法只能请教共事,才发现问题其实不在此。
因为在这句sql执行当时,下面的代码直接的使用了sql1执行的结果集。
并且对这个结果集合中的某些字段从新查询:
例如下面的sql就对结果集合中的InvoiceType这个字段停止判断,并使用了这个findSysParaName()方法(这个方法里头是一个sql查询《这里可以认为是sql2》)失掉结果,并从新写入到第一条sql的结果集合中。
tmp[1]= !StringUtils.isEmpty(obj.getInvoiceType()) ? obj.getInvoiceType()+" "+findNameFacadeImpl.findSysParaName("VD", "INVOICE_TYPE", obj.getInvoiceType()) : "";
每日一道理
如果说友谊是一颗常青树,那么,浇灌它的必定是出自心田的清泉;如果说友谊是一朵开不败的鲜花,那么,照耀它的必定是从心中升起的太阳。 多少笑声都是友谊唤起的,多少眼泪都是友谊揩干的。友谊的港湾温情脉脉,友谊的清风灌满征帆。友谊不是感情的投资,它不需要股息和分红。(友谊可以换其他词语)
所以执行过程中下面的sql就会执行多次,从而影响了效率:解决办法就是将下面的sql2参加到上面的 sql1《我这里使用左链接》中.从而使得程序只执行sql1一次,提高了效率。
举个例子:
<sql1>
select name from people;
<sql2>
select age from employee where name=name <sql1的结果>
那么我们将两个sql结合在一起:
select name ,age from people left join employee on employee .name=people.name <sql1的结果>
最终程序实现优化。
就将这么多吧,其实就是一开始进入了一个sql优化所带来的一个误区。这里就总结出一个经验教训,以后如果涌现很多自己没有把握解决的问题,尽早的请教共事或者他人,从而不至于在误区里头徘徊不前。
文章结束给大家分享下程序员的一些笑话语录: 据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。
硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。”
项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”