免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1664 | 回复: 6
打印 上一主题 下一主题

求助SQL的优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-09 10:56 |只看该作者 |倒序浏览
我有这么一条语句:
SELECT   200505, 'AR', 'AR_FROZEN', edate,    ardpfx
                                           || rinvc, SUM (rcamt) amt
    FROM acrrar
   WHERE rrid = 'RI'
     AND    ardpfx
         || rinvc IN (SELECT   rinvc
                          FROM (SELECT      ardpfx
                                         || rinvc rinvc,
                                         SUM (rcamt) * (-1) amt
                                    FROM acrrar
                                   WHERE rrid = 'RI' AND edate = 20050225
                                GROUP BY ardpfx, rinvc
                                UNION
                                SELECT      ardpfx
                                         || rinvc rinvc,
                                         SUM (rcamt) amt
                                    FROM acrrar
                                   WHERE rrid = 'RI' AND edate = 20050325
                                GROUP BY ardpfx, rinvc)
                      GROUP BY rinvc
                        HAVING SUM (amt) <>; 0)
     AND edate IN (20050225, 20050325)
GROUP BY edate, ardpfx, rinvc
运行起来,n长时间也跑不出来;
如果把rrid = 'RI'去掉,
SELECT   200505, 'AR', 'AR_FROZEN', edate,    ardpfx
                                           || rinvc, SUM (rcamt) amt
    FROM acrrar
   WHERE  ardpfx
         || rinvc IN (SELECT   rinvc
                          FROM (SELECT      ardpfx
                                         || rinvc rinvc,
                                         SUM (rcamt) * (-1) amt
                                    FROM acrrar
                                   WHERE rrid = 'RI' AND edate = 20050225
                                GROUP BY ardpfx, rinvc
                                UNION
                                SELECT      ardpfx
                                         || rinvc rinvc,
                                         SUM (rcamt) amt
                                    FROM acrrar
                                   WHERE rrid = 'RI' AND edate = 20050325
                                GROUP BY ardpfx, rinvc)
                      GROUP BY rinvc
                        HAVING SUM (amt) <>; 0)
     AND edate IN (20050225, 20050325)
GROUP BY edate, ardpfx, rinvc

马上就可以跑出来,我不大了解,认为是Index的关系,于是加了个rrid(只是个标志位,仅有两个值)的索引,还是跑不出来,又加了个rrid,ardpfx,rinvc,edate的索引,还是跑不出来,我不知是什么原因,请各位高手赐教,万分感激!

论坛徽章:
0
2 [报告]
发表于 2005-06-09 15:54 |只看该作者

求助SQL的优化

怎么没有人回复啊?我顶一下。

论坛徽章:
0
3 [报告]
发表于 2005-06-10 11:12 |只看该作者

求助SQL的优化

继续顶

论坛徽章:
0
4 [报告]
发表于 2005-06-11 10:14 |只看该作者

求助SQL的优化

加上rrid = 'RI'时是要逐条比对的,速度肯定会很慢,再怎么建索引估计也无济于事。你可以将rrid = 'RI'放在最后,如下试试:

select * from
(
SELECT   200505, 'AR', 'AR_FROZEN', edate,    ardpfx
                                          || rinvc af, SUM (rcamt) amt
   FROM acrrar
  WHERE ardpfx
        || rinvc IN (SELECT   rinvc
                         FROM (SELECT      ardpfx
                                        || rinvc rinvc,
                                        SUM (rcamt) * (-1) amt
                                   FROM acrrar
                                  WHERE rrid = 'RI' AND edate = 20050225
                               GROUP BY ardpfx, rinvc
                               UNION
                               SELECT      ardpfx
                                        || rinvc rinvc,
                                        SUM (rcamt) amt
                                   FROM acrrar
                                  WHERE rrid = 'RI' AND edate = 20050325
                               GROUP BY ardpfx, rinvc)
                     GROUP BY rinvc
                       HAVING SUM (amt) <>; 0)
    AND edate IN (20050225, 20050325)
GROUP BY edate, ardpfx, rinvc
) where rrid = 'RI'

论坛徽章:
0
5 [报告]
发表于 2005-06-13 11:31 |只看该作者

求助SQL的优化

你的SQL语句太复杂了,如果在存储过程里面,应该用分步的办法实现

论坛徽章:
0
6 [报告]
发表于 2005-06-14 11:20 |只看该作者

求助SQL的优化

原帖由 "shadowindy" 发表:
加上rrid = 'RI'时是要逐条比对的,速度肯定会很慢,再怎么建索引估计也无济于事。你可以将rrid = 'RI'放在最后,如下试试:

select * from
(
SELECT   200505, 'AR', 'AR_FROZEN', edate,    ardpfx
      ..........


这样好像也很慢,我把语句换成下面的样子,快了很多,但还是需要十多秒:
SELECT   200505, 'AR', 'AR_FROZEN', edate,    ardpfx
                                          || rinvc, SUM (rcamt) amt
   FROM acrrar
  WHERE rrid||ardpfx
        || rinvc IN (SELECT   rrid||rinvc
                         FROM (SELECT      ardpfx
                                        || rinvc rinvc,
                                        SUM (rcamt) * (-1) amt
                                   FROM acrrar
                                  WHERE rrid = 'RI' AND edate = 20050225
                               GROUP BY ardpfx, rinvc
                               UNION
                               SELECT      ardpfx
                                        || rinvc rinvc,
                                        SUM (rcamt) amt
                                   FROM acrrar
                                  WHERE rrid = 'RI' AND edate = 20050325
                               GROUP BY ardpfx, rinvc)
                     GROUP BY rinvc
                       HAVING SUM (amt) <>; 0)
    AND edate IN (20050225, 20050325)
GROUP BY edate, ardpfx, rinvc

论坛徽章:
0
7 [报告]
发表于 2005-06-14 17:52 |只看该作者

求助SQL的优化

跟踪这个sql,看看执行计划是怎样的和两个sql的成本如何,不就知道了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP