查看: 4633|回复: 24

[性能调整] SQL 优化问题

[复制链接]
论坛徽章:
3742
生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41
发表于 2011-11-24 10:21 | 显示全部楼层 |阅读模式
本帖最后由 chenzhen232 于 2011-11-24 10:21 编辑

DB:10.2.0.4

select z.STOCK_ID,
       z.ORG_ID,
       z.CALC_PERIOD_ID,
       z.PRODUCT_ID,
       z.month_info,
       sum(z.OPENING) opening,
       sum(z.exchange) exchange,
       sum(z.sales) sales,
       sum(z.ending) ending,
       z.STATUS,
       0 as ordering,
       0 as deleted,
       z.ORG_code,
       z.org_name,
       z.product_code,
       z.product_name,
       decode(isunion, 1, -1, z.pid) Pid,
       decode(isunion, 1, 'NML', z.code) Code
  from ZR_STOCK_VW_DISUNION z
group by z.STOCK_ID,
          z.month_info,
          z.ORG_ID,
          z.CALC_PERIOD_ID,
          z.PRODUCT_ID,
          z.STATUS,
          z.ORG_code,
          z.org_name,
          z.product_code,
          z.product_name,
          decode(isunion, 1, -1, z.pid),
          decode(isunion, 1, 'NML', z.code);

执行计划,请见附件。 sql explain.txt (15.3 KB, 下载次数: 67)
论坛徽章:
469
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2011-11-24 10:26 | 显示全部楼层
product_id 在其中,product_code,product_name也在其中,简直就是垃圾的group by 分组。。。

使用道具 举报

回复
论坛徽章:
3742
生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41
 楼主| 发表于 2011-11-24 10:31 | 显示全部楼层
solomon_007 发表于 2011-11-24 10:26
product_id 在其中,product_code,product_name也在其中,简直就是垃圾的group by 分组。。。

不要管开发如何分组了。 这sql在另外的一个库上20秒能出来。在这个库上5分钟。

使用道具 举报

回复
论坛徽章:
3742
生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41
 楼主| 发表于 2011-11-24 10:32 | 显示全部楼层
CREATE OR REPLACE VIEW ZR_STOCK_VW_DISUNION AS
select "STOCK_ID",
       s."ORG_ID",
       s."CALC_PERIOD_ID",
       s."PRODUCT_ID",
       s."OPENING",
       s."EXCHANGE",
       decode(nvl(cp.active, 0),
              0,
              s."SALES",
              zr_stock_pkg.GetSales(s.org_id,
                                    s.calc_period_id,
                                    s.product_id,
                                    zp.id,
                                    0)) sales,
       decode(nvl(cp.active, 0),
              0,
              s.ending,
              nvl(opening, 0) + nvl(exchange, 0) -
              zr_stock_pkg.GetSales(s.org_id,
                                    s.calc_period_id,
                                    s.product_id,
                                    zp.id,
                                    0)) ending,
       s."STATUS",
       s."CREATION_USER",
       s."CREATION_TIME",
       s."LAST_MOD_USER",
       s."LAST_MOD_TIME",
       s."DELETED",
       s."ORDERING",
       cp.month_info,
       o.org_code,
       O.org_name,
       p.product_code,
       p.product_name,
       zp.id as pid,
       zp.code,
       zp.isunion
  from zr_stock             s,
       zr_calc_period       cp,
       zr_organization      o,
       zr_product           p,
       zr_product_pricecode zp
where s.org_id = o.org_id
   and s.product_id = p.product_id
   and s.calc_period_id = cp.calc_period_id
   and cp.deleted = 0
   and s.pcid = zp.id
union all
select s.SPECIAL_STORE_ID,
       s.SPECIAL_STORE_ID,
       s.CALC_PERIOD_ID,
       s.product_id,
       0,
       0,
       sales,
       0 - sales,
       1,
       0,
       sysdate,
       0,
       sysdate,
       0,
       0,
       month_info,
       o.org_code,
       O.org_name,
       p.product_code,
       p.product_name,
       s.pid,
       s.pcode,
       zp.isunion
  from (SELECT A.SPECIAL_STORE_ID,
               A.CALC_PERIOD_ID,
               B.PRODUCT_ID,
               B.PID,
               b.pcode,
               SUM(b.QTY) sales,
               a.month_info
          FROM ZR_ORDER_HEADER_CSB A, ZR_ORDER_LINE_CSB B
         WHERE A.ORDER_HEADER_ID = B.ORDER_HEADER_ID
           AND A.DELETED = 0
           AND A.STATUS = 0
           AND NOT EXISTS (SELECT 0
                  FROM ZR_STOCK Z
                 WHERE A.SPECIAL_STORE_ID = Z.ORG_ID
                   AND A.CALC_PERIOD_ID = Z.CALC_PERIOD_ID
                   AND B.PID = Z.PCID
                   AND B.PRODUCT_ID = Z.PRODUCT_ID)
         GROUP BY A.SPECIAL_STORE_ID,
                  A.CALC_PERIOD_ID,
                  B.PRODUCT_ID,
                  B.PID,
                  b.pcode,
                  a.month_info) s,
       zr_organization o,
       zr_product p,
       zr_product_pricecode zp
where s.SPECIAL_STORE_ID = o.org_id
   and p.deleted = 0
   and zp.id=s.pid
   and s.product_id = p.product_id;

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2011-11-24 10:34 | 显示全部楼层
这里的ZR_STOCK_VW_DISUNION是一张复杂SQL语句的视图, 该试图引用的基表太多了,
如果要优化,还是要从原SQL语句入手!

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2011-11-24 10:42 | 显示全部楼层
chenzhen232 发表于 2011-11-24 10:31
不要管开发如何分组了。 这sql在另外的一个库上20秒能出来。在这个库上5分钟。

我看原语句是很难优化了, 应用的表多,而且还是用了自定义的package。
Lz, 你目前语句在2个不同的库运行差别如此大, 那是否2个库表的数据量是否完全相同, 数据库的系统环境也是否完全一致, 另外2个库运行的语句得到的执行计划也是否完全相同?

使用道具 举报

回复
论坛徽章:
3742
生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41生肖徽章2007版:羊
日期:2013-02-08 10:53:41
 楼主| 发表于 2011-11-24 10:55 | 显示全部楼层
bell6248 发表于 2011-11-24 10:42
我看原语句是很难优化了, 应用的表多,而且还是用了自定义的package。
Lz, 你目前语句在2个不同的库运 ...

慢的: 32bit win2003 10.2.0.4
快的: 64bit win2008 10.2.0.4
数据量: 相同
执行计划:这个是快的库的 kuai.txt (17.07 KB, 下载次数: 29)

使用道具 举报

回复
论坛徽章:
1
2012新春纪念徽章
日期:2012-01-04 11:58:44
发表于 2011-11-24 11:00 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
1
2012新春纪念徽章
日期:2012-01-04 11:58:44
发表于 2011-11-24 11:00 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2011-07-22 01:01:02蜘蛛蛋
日期:2011-08-24 14:10:13ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26
发表于 2011-11-24 12:57 | 显示全部楼层
嘿嘿,给钱 1行一元 帮你优化

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表