楼主: liweixtu

[笔记] 求助:一个关于ORACLE索引的疑难杂症

[复制链接]
招聘 : 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
11#
发表于 2007-7-5 09:14 | 只看该作者
最初由 catchwo 发布
[B]这个sql是以Ec_Quantity_History Tb 驱动
不对,你仔细看上面分析的帖子[/COLOR]


1 IDX_EC_QUANTITY_HISTORY4 比 IDX_EC_QUANTITY_HISTORY1 过滤的结果多很多

不对,不加exists条件时走索引4过滤执行时间也很快[/COLOR]


2 然后加上一个NL

这个NL是如何执行的是个问题[/COLOR]

结果就是every slowly [/B]

使用道具 举报

回复
招聘 : 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
12#
发表于 2007-7-5 09:25 | 只看该作者
这个问题比较怪异,至少我从没遇到过,
虽然楼主给的信息严重不足,但可以讨论一下各种可能性

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
13#
发表于 2007-7-5 10:04 | 只看该作者
0 这些表如果最近没有分析过其执行计划里的cost是不准确的!

这个sql是以Ec_Quantity_History Tb 驱动
不对,你仔细看上面分析的帖子
这个我搞错了


1 IDX_EC_QUANTITY_HISTORY4 比 IDX_EC_QUANTITY_HISTORY1 过滤的结果多很多

不对,不加exists条件时走索引4过滤执行时间也很快
这时不用NL,所以会很快

2 然后加上一个NL

这个NL是如何执行的是个问题
这是cbo根据cost来选则的
注意:
  NESTED LOOPS    /*+这个NL是怎么做的?*/        67    1    91
    SORT UNIQUE            35    1    52
     TABLE ACCESS BY INDEX ROWID    EC_ACC_FEE_BACK        35    1    52
      INDEX RANGE SCAN    IDX_EC_ACC_FEE_BACK11    "ZONE_CODE"='011301' AND "ACC_FEE_DATE" LIKE '200706%'    5    892   
    INDEX RANGE SCAN    IDX_EC_QUANTITY_HISTORY4    "ZONE_CODE"='011301' AND "REPORT_FORM_MONTH"='200706'    4

这里不是索引和索引进行NL,而是TABLE ACCESS BY INDEX ROWID    EC_ACC_FEE_BACK 的行集与IDX_EC_QUANTITY_HISTORY4进行NL


结果就是very slowly

使用道具 举报

回复
招聘 : 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
14#
发表于 2007-7-5 12:15 | 只看该作者
最初由 catchwo 发布
[B]
2 然后加上一个NL

这个NL是如何执行的是个问题
这是cbo根据cost来选则的
注意:
[php]
  NESTED LOOPS    /*+这个NL是怎么做的?*/        67    1    91
    SORT UNIQUE            35    1    52
     TABLE ACCESS BY INDEX ROWID    EC_ACC_FEE_BACK        35    1    52
      INDEX RANGE SCAN    IDX_EC_ACC_FEE_BACK11    "ZONE_CODE"='011301' AND "ACC_FEE_DATE" LIKE '200706%'    5    892   
    INDEX RANGE SCAN    IDX_EC_QUANTITY_HISTORY4    "ZONE_CODE"='011301' AND "REPORT_FORM_MONTH"='200706'    4

[/php]
这里不是索引和索引进行NL,而是TABLE ACCESS BY INDEX ROWID    EC_ACC_FEE_BACK 的行集与IDX_EC_QUANTITY_HISTORY4进行NL
这是怎么个走法?关联字段都不在索引列里

结果就是very slowly [/B]

不过有一点应该可以肯定
表的统计信息是不对的。。。

使用道具 举报

回复
招聘 : 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
15#
发表于 2007-7-5 12:22 | 只看该作者
NLJ

nlj.jpg (30.48 KB, 下载次数: 13)

nlj.jpg

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
16#
发表于 2007-7-5 13:49 | 只看该作者
1 TABLE ACCESS BY INDEX ROWID EC_ACC_FEE_BACK  已经返回的是EC_ACC_FEE_BACK  表的一个子集不是索引的子集(所有列都在每一行里)
2 对上面那个子集排序后(SORT UNIQUE)
3 与索引IDX_EC_QUANTITY_HISTORY4   的子集 进行NL

NL原理和两个嵌套循环类似
FOR(.....)
{
FOR(.....)
{
  .........
}
}


上面那个只是一个原理图----且不是十分正确

使用道具 举报

回复
招聘 : 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
17#
发表于 2007-7-5 15:18 | 只看该作者
最初由 catchwo 发布
[B]1 TABLE ACCESS BY INDEX ROWID EC_ACC_FEE_BACK  已经返回的是EC_ACC_FEE_BACK  表的一个子集不是索引的子集(所有列都在每一行里)

2 对上面那个子集排序后(SORT UNIQUE)
子集A

3 与索引IDX_EC_QUANTITY_HISTORY4   的子集 ( 子集B)进行NL

NL原理和两个嵌套循环类似
FOR(.....)
{
FOR(.....)
{
  .........
}
}


上面那个只是一个原理图----且不是十分正确 [/B]


如上绿字部分,子集A和子集B没有关系,如何NL?

你强调了EC_ACC_FEE_BACK  表的所有列,但这没用,没有做关联,索引IDX_EC_QUANTITY_HISTORY4   的字段在EC_ACC_FEE_BACK  表中有没有,是否同样的意义,对于ORACLE来说是未知的

所以,如果子集B是TABLE ACCESS BY INDEX IDX_EC_QUANTITY_HISTORY4    ROWID 后的结果倒是可能NL的,可从执行计划看,不是这样

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
18#
发表于 2007-7-5 15:35 | 只看该作者
由于没有关联字段,所以此NL就是子集A和子集B的一个笛卡尔集。所以会very slowly 以下是个NL=笛卡尔集的图例

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2007-08-09 15:37:26会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB元老
日期:2007-10-15 21:12:09ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2013-06-24 14:20:02
19#
发表于 2007-7-5 15:39 | 只看该作者
如图:

nl.jpg (120.04 KB, 下载次数: 14)

nl.jpg

使用道具 举报

回复
招聘 : 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
20#
发表于 2007-7-6 10:32 | 只看该作者
最初由 catchwo 发布
[B]由于没有关联字段,所以此NL就是子集A和子集B的一个笛卡尔集。所以会very slowly 以下是个NL=笛卡尔集的图例 [/B]

我也知道这样的NL只可能是笛卡儿集,只是奇怪为什么不干脆MERGE JOIN (CARTESIAN)呢,在不hint NL的情况下,我试了几个版本都无法模拟出楼主的情况
之前说的楼主的表统计信息错误并且乱加HINT应该是造成这个问题的原因,但就算信息错误,也不应该是NL啊

使用道具 举报

回复

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

本版积分规则 发表回复

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