收集统计信息让SQL走正确的执行计划

数据库环境:SQL SERVER 2005

今天在生产库里抓到一条跑得慢的SQL,语句不是很复杂,返回的数据才有800多行,

却执行了34分钟,甚至更久。

先看一下执行结果

我贴一下SQL。

SELECT  a.dec_yt1 ,
        b.dec_yt1 ,
        a.dec_yt2 ,
        b.dec_yt2 ,
        a.dec_yt3 ,
        b.dec_yt3
FROM    ctlm8288 a ,
        ( SELECT    t.corr_id ,
                    t.clerk_id ,
                    ROUND(SUM(ISNULL(t.dec_yt1, 0)), 2) AS dec_yt1 ,
                    ROUND(SUM(ISNULL(t.dec_yt2, 0)), 2) AS dec_yt2 ,
                    ROUND(SUM(ISNULL(t.dec_yt3, 0)), 2) AS dec_yt3
          FROM      ( SELECT    b.corr_id ,
                                b.clerk_id ,
                                CASE WHEN d.feetype_flag = '1'
                                     THEN ROUND(SUM(a.dec_sqty * c.fee_price),
                                                2)
                                END AS dec_yt1 ,
                                CASE WHEN d.feetype_flag = '2'
                                     THEN ROUND(SUM(a.dec_sqty * c.fee_price),
                                                2)
                                END AS dec_yt2 ,
                                CASE WHEN d.feetype_flag = '3'
                                     THEN ROUND(SUM(a.dec_sqty * c.fee_price),
                                                2)
                                END AS dec_yt3
                      FROM      ctlm8666 a ,
                                ctlm8001 b ,
                                v_saft04 c ,
                                ctlm8206 d
                      WHERE     a.terminal_id = b.terminal_id
                                AND b.dept_id = c.dept_id
                                AND a.item_id = c.vitem_id
                                AND c.fee_id = d.fee_id
                                AND d.flag_t = 'Y'
                                AND a.fiscal_year = 2015
                                AND a.fiscal_period <= 6
                                AND c.cur_year = 2015
                                AND b.tertype_id LIKE '0102%'
                      GROUP BY  b.corr_id ,
                                b.clerk_id ,
                                c.fee_id ,
                                d.feetype_flag
                    ) t
          GROUP BY  t.corr_id ,
                    t.clerk_id
        ) b
WHERE   a.corr_id = b.corr_id
        AND a.clerk_id = b.clerk_id
        AND a.fiscal_year = 2015
        AND a.fiscal_period = 6

SQL的写法没太大问题,我试着执行下,然后就是漫长的等待过程...

30分过去了,还没出结果,我看了执行计划,就知道问题出在哪了。

看了执行计划圈红的地方,优化器对ctlm8666和ctlm8001表预估只有一行,然后对这2张表做下统计,看是否真的只有1行。

SELECT  COUNT(*)
FROM    ctlm8666 a
WHERE   a.fiscal_year = 2015
        AND a.fiscal_period <= 6--1650439
SELECT  COUNT(*)
FROM    ctlm8001 b
WHERE   b.tertype_id LIKE '0102%'--229823

预估数据和实际数据差别很大,出现这种情况,很可能的原因就是统计信息出问题了。

对ctlm8666表收集统计信息,在跑的SQL很快就有结果了。

我重新执行了下,看收集统计信息后,SQL执行要多久,下图是结果。

(本文完)

转载于:https://www.cnblogs.com/boss-he/p/4648536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值