查看: 5607|回复: 36

帮忙优化一条语句

[复制链接]
论坛徽章:
15
数据库板块每日发贴之星
日期:2008-06-30 01:01:54奥运会纪念徽章:羽毛球
日期:2012-06-26 15:21:24ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26数据库板块每日发贴之星
日期:2011-07-15 01:01:01ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010年世界杯参赛球队:加纳
日期:2010-07-27 08:59:132010年世界杯参赛球队:智利
日期:2010-07-14 16:06:302010年世界杯参赛球队:斯洛伐克
日期:2010-07-10 02:35:492010年世界杯参赛球队:英格兰
日期:2010-07-09 18:54:212010年世界杯参赛球队:瑞士
日期:2010-01-22 13:33:24
发表于 2010-8-16 17:34 | 显示全部楼层 |阅读模式
SELECT *
  FROM eh_ladingbill
WHERE (nvl(dr, 0) = 0)
   and (nvl(dr, 0) = 0 and vbillstatus = 1 and pk_corp = '1031' and
       billno not in (select billcode
                         from dap_finindex
                        where pk_corp = '1031'
                          and nvl(dr, 0) = 0))





Execution Plan
----------------------------------------------------------
Plan hash value: 278430534

----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |  7551 |  5530K|  6146K  (1)| 20:29:15 |
|*  1 |  FILTER                      |                      |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| EH_LADINGBILL        |  7552 |  5531K|  2051   (1)| 00:00:25 |
|*  3 |    INDEX RANGE SCAN          | INDX_LADINGBILL_CORP |  8141 |       |     8   (0)| 00:00:01 |
|*  4 |   TABLE ACCESS BY INDEX ROWID| DAP_FININDEX         |     1 |    22 |  1627   (1)| 00:00:20 |
|*  5 |    INDEX SKIP SCAN           | I_DAP_INDEX          |  7901 |       |   842   (1)| 00:00:11 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "DAP_FININDEX" "DAP_FININDEX" WHERE
              NVL("DR",0)=0 AND LNNVL("BILLCODE"<>:B1) AND "PK_CORP"='1031'))
   2 - filter("VBILLSTATUS"=1 AND NVL("DR",0)=0)
   3 - access("PK_CORP"='1031')
   4 - filter(NVL("DR",0)=0 AND LNNVL("BILLCODE"<>:B1))
   5 - access("PK_CORP"='1031')
       filter("PK_CORP"='1031')


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
    8566989  consistent gets
          7  physical reads
          0  redo size
     729469  bytes sent via SQL*Net to client
       3451  bytes received via SQL*Net from client
        285  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       4253  rows processed

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
发表于 2010-8-16 17:59 | 显示全部楼层




在subquery加个hints/*+ unnest  */或者可以改写一下语句!


SELECT a.*
  FROM eh_ladingbill a
WHERE nvl(a.dr, 0) = 0
   and      a.vbillstatus = 1
   and      a.pk_corp = '1031'
   and      exists(select 1 from dap_finindex b where b.billcode = a.billno and b.pk_corp = '1031' and b.nvl(dr, 0) = 0);


使用道具 举报

回复
论坛徽章:
9
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51蛋疼蛋
日期:2011-08-09 14:26:55ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥迪
日期:2013-09-12 15:57:042014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
发表于 2010-8-16 20:37 | 显示全部楼层

回复 #2 bell6248 的帖子

你的SQL逻辑根本就不对吧。

楼主这个SQL是NOT IN慢么? 让子查询直接和主表做HASH JOIN估计会快些。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
16
2009新春纪念徽章
日期:2009-01-04 14:52:282014年新春福章
日期:2014-02-18 16:43:092013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥运会纪念徽章:艺术体操
日期:2012-07-24 12:01:27奥运会纪念徽章:乒乓球
日期:2012-07-23 18:08:47奥运会纪念徽章:铁人三项
日期:2012-06-20 13:06:10ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:游泳
日期:2010-10-19 11:09:06
发表于 2010-8-16 20:49 | 显示全部楼层
SELECT *
  FROM eh_ladingbill eh
WHERE (nvl(dr, 0) = 0)
   and (nvl(dr, 0) = 0 and vbillstatus = 1 and pk_corp = '1031' and
        not exists (select 1
                         from dap_finindex
                        where pk_corp = '1031'
                          and nvl(dr, 0) = 0 and eh.billno=billcode)
)

使用道具 举报

回复
论坛徽章:
9
奥运会纪念徽章:水球
日期:2008-10-24 13:17:39生肖徽章2007版:猪
日期:2009-11-17 16:40:482010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:19:50ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:卡巴迪
日期:2010-12-06 11:00:042011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
发表于 2010-8-16 21:03 | 显示全部楼层
楼主感觉是慢在哪里了?
统计信息收集了吗?

使用道具 举报

回复
论坛徽章:
13
2010广州亚运会纪念徽章:轮滑
日期:2010-09-03 12:44:53马上有房
日期:2014-04-04 13:51:34马上加薪
日期:2014-04-04 13:35:40优秀写手
日期:2014-03-14 06:00:13夏利
日期:2013-08-05 18:32:18复活蛋
日期:2013-06-25 17:22:592013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2013-01-08 18:08:502011新春纪念徽章
日期:2011-02-18 11:43:33生肖徽章2007版:兔
日期:2011-01-20 12:58:49
发表于 2010-8-17 00:56 | 显示全部楼层
关注

使用道具 举报

回复
论坛徽章:
7
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212011新春纪念徽章
日期:2011-02-18 11:43:34鲜花蛋
日期:2011-05-26 15:54:08ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:44秀才
日期:2016-01-21 13:42:39射手座
日期:2016-03-04 16:38:02
发表于 2010-8-17 09:02 | 显示全部楼层
vbillstatus = 1 and pk_corp = '1031'  建立复合索引

SELECT *
  FROM eh_ladingbill eh
WHERE (nvl(dr, 0) = 0)
   and (nvl(dr, 0) = 0 and vbillstatus = 1 and pk_corp = '1031' and
        not exists (select 1
                         from dap_finindex
                        where pk_corp = '1031'
                          and nvl(dr, 0) = 0 and eh.billno=billcode)
)

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-17 09:20 | 显示全部楼层
SELECT *
  FROM eh_ladingbill
WHERE (nvl(dr, 0) = 0)
   and (nvl(dr, 0) = 0 and vbillstatus = 1 and pk_corp = '1031'
and billno is not null   
and
       billno not in (select billcode
                         from dap_finindex
                        where pk_corp = '1031'
                          and billcode is not null
                          and nvl(dr, 0) = 0))

或者

SELECT *
  FROM eh_ladingbill
WHERE (nvl(dr, 0) = 0)
   and (nvl(dr, 0) = 0 and vbillstatus = 1 and pk_corp = '1031'
and not exists(select 1
                         from dap_finindex
                        where
                          pk_corp = '1031'
                          and eh_ladingbill.billcode=dap_findex.billcode
                          and nvl(dr, 0) = 0))

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-17 09:33 | 显示全部楼层
eh_ladingbill没有设计记录单据生成的凭证信息?
怎么联查?

使用道具 举报

回复
论坛徽章:
15
数据库板块每日发贴之星
日期:2008-06-30 01:01:54奥运会纪念徽章:羽毛球
日期:2012-06-26 15:21:24ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26数据库板块每日发贴之星
日期:2011-07-15 01:01:01ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010年世界杯参赛球队:加纳
日期:2010-07-27 08:59:132010年世界杯参赛球队:智利
日期:2010-07-14 16:06:302010年世界杯参赛球队:斯洛伐克
日期:2010-07-10 02:35:492010年世界杯参赛球队:英格兰
日期:2010-07-09 18:54:212010年世界杯参赛球队:瑞士
日期:2010-01-22 13:33:24
 楼主| 发表于 2010-8-17 10:08 | 显示全部楼层
原帖由 winerr 于 2010-8-17 09:02 发表
vbillstatus = 1 and pk_corp = '1031'  建立复合索引

SELECT *
  FROM eh_ladingbill eh
WHERE (nvl(dr, 0) = 0)
   and (nvl(dr, 0) = 0 and vbillstatus = 1 and pk_corp = '1031' and
        not exists (select 1
                         from dap_finindex
                        where pk_corp = '1031'
                          and nvl(dr, 0) = 0 and eh.billno=billcode)
)






建索引没效果:


Execution Plan
----------------------------------------------------------
Plan hash value: 278430534

----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |  7551 |  5530K|  6146K  (1)| 20:29:15 |
|*  1 |  FILTER                      |                      |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| EH_LADINGBILL        |  7552 |  5531K|  2007   (1)| 00:00:25 |
|*  3 |    INDEX RANGE SCAN          | INDX_LADINGBILL_CORP |  7815 |       |     9   (0)| 00:00:01 |
|*  4 |   TABLE ACCESS BY INDEX ROWID| DAP_FININDEX         |     1 |    22 |  1627   (1)| 00:00:20 |
|*  5 |    INDEX SKIP SCAN           | I_DAP_INDEX          |  7901 |       |   842   (1)| 00:00:11 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "DAP_FININDEX" "DAP_FININDEX" WHERE
              NVL("DR",0)=0 AND LNNVL("BILLCODE"<>:B1) AND "PK_CORP"='1031'))
   2 - filter(NVL("DR",0)=0)
   3 - access("VBILLSTATUS"=1 AND "PK_CORP"='1031')
   4 - filter(NVL("DR",0)=0 AND LNNVL("BILLCODE"<>:B1))
   5 - access("PK_CORP"='1031')
       filter("PK_CORP"='1031')


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
    8566708  consistent gets
         24  physical reads
          0  redo size
     729469  bytes sent via SQL*Net to client
       3451  bytes received via SQL*Net from client
        285  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       4253  rows processed

SQL>

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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