一个查询(报表)优化案例

原创 2016年11月19日 17:00:34

环境:SQL Server 2012 SP1

一个查询(报表),返回约6千条记录,运行44秒,涉及十几个表的LEFT JOIN,其实每个表的数据量并不大,几万,多的也才几十万,类ERP系统

查询代码像这个样子:

Select T1.Col1,....Tn.ColN

  From T1 LEFT JOIN T2 ON ...

            LEFT JOIN T3 ON (T1.Src=T3.Src and T1.Target=T3.Target) OR (T1.Target=T3.Src and T1.Src=T3.Target)....

            LEFT JOIN Tn....


话说这个T3也接近6万行,存储的是两个城市之间的距离。

初次将T3改写为:

LEFT JOIN (Select Src,Target From T3

                      UNION

                      Select Target,Src From T3) T3 On T1.Src=T3.Src and T1.Target=T3.Target

执行时间减少到9秒


再次将查询拆分为3次,一次LEFT JOIN 5、6个表,也就是先LEFT JOIN 5、6个到临时表,再由临时表LEFT JOIN 5、6个表再存入临时表,

再次类似处理。。。


最终执行时间为 2~3 秒。告以段落


还可以将两个城市间的数据实体化,因为城市基础数据很少变动,即使变动稍作加工就成,会减少 UNION 那步成本消耗


原因也很简单,一次LEFT JOIN太多,SQL SERVER优化器可能会找不到优化的执行路径、策略,很难估算出结果可能会有多少,很容易把

优化器搞糊了(不管是SQL SERVER还是ORACLE,都一样。MySQL就更不用说了,复杂些的SQL只能让其尴尬+为难)

相关文章推荐

一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例

MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例

清算/报表/日终跑批程序之性能优化案例(一)

前言 不知不觉,技术人生系列·我和数据中心的故事来到了第五期。小y又和大家见面了! 前几期主要发了一些TroubleShooting的案例分享,其实小y最擅长的是性能优化,所以...

一个通过dblink查询的优化案例(去掉filter)

原语句如下 EXPLAIN PLAN FOR SELECT a.*, b.rkids FROM (SELECT gys.khbh, gys.khmc, ...

一个跨库复杂查询的SQL优化的案例

导读 为了帮客户出一个报表,需要跨三个库进行一个复杂的查询,用到了 in,union all,left join等关键字, 其中几个字段还需要进行SUM,Count等计算。未优化前查询耗时368秒。 ...

一个Web报表项目的性能分析和优化实践(三) :提高Web应用服务器Tomcat的内存配置,并确认配置正确

上一篇,总体讲述了项目中的一些情况。小试牛刀,统一显示了Web项目SQL语句的执行时间。本篇,将重点介绍提高Web应用服务器Tomcat的内存配置,并确认配置正确的方法。...

一个Web报表项目的性能分析和优化实践(七):性能监测工具JavaMelody

JavaMelody 能够监测Java或Java EE应用程序服务器,并以图表的方式显示: Java内存和Java CPU使用情况,用户Session数量,JDBC连接数, 和http请求、sql请求...

一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)

就是这么一个简单的事,花了几个小时,查询很多资料,请教好友同事“飞鸟”,才搞定这个问题。 问题中存在问题,问题中存在陷阱,是这个问题的真实写照。...

一个Web报表项目的性能分析和优化实践(五):重构有助于性能优化么?

重构是否有助于性能优化,是一个见仁见智的问题。 根据我有限的重构和优化经验,只能说,“重构有助于优化性能,但作用有限”。 打个比喻,当你学画画,想要画一个苹果的时候,“把苹果洗干净”是否有助于你画出一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个查询(报表)优化案例
举报原因:
原因补充:

(最多只允许输入30个字)