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

环境: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只能让其尴尬+为难)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值