12
返回列表 发新帖
楼主: 小比例尺

如何用提示改变查询的执行计划?

[复制链接]
论坛徽章:
18
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53ITPUB十周年纪念徽章
日期:2011-09-27 16:32:492010广州亚运会纪念徽章:跆拳道
日期:2010-11-25 10:18:43ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010新春纪念徽章
日期:2010-03-01 11:04:58祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-10-04 11:36:14生肖徽章2007版:鼠
日期:2009-07-25 02:29:06生肖徽章2007版:狗
日期:2009-07-14 18:17:34生肖徽章2007版:龙
日期:2009-04-20 09:08:21
11#
 楼主| 发表于 2008-4-7 17:31 | 只看该作者
原帖由 mihawk 于 2008-4-7 17:26 发表
我认为可能的原因有两个,

1. 因为你使用的是常量来查询, 所以cbo会使用直方图来估算会得到多少笔记录, 从而计算使用index的cost是多少, 这个时候如果直方图不准确, 可能就会导致计算出来的索引扫描成本高于table scan的成本, 最后cbo就会选择成本较低的table scan.

2.直方图是准确的, 确实你这个sql返回的记录集很大, 应该走table scan更合理.这个可以通过hint指定索引, set trace on来确定. 到底应该走索引还是应该走全表扫描.

不过可以简单估算一下, 20080301~20080310之间有64200笔记录, 索引扫描总成本为49885.
而20080301~20080320之间有183144笔记录, 如果简单按比例来算的话扫描成本是 49885/64200*183144=142307.
而cbo估算的全表扫描成本是90365.
所以cbo选择了全表扫描, 成本9w, 比索引扫描的成本14w要小.


你好,请教一个问题。如果一个列唯一,那么在这个列上做直方图统计有意义吗?
谢谢

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
12#
发表于 2008-4-7 17:46 | 只看该作者
原帖由 小比例尺 于 2008-4-7 17:31 发表


你好,请教一个问题。如果一个列唯一,那么在这个列上做直方图统计有意义吗?
谢谢


直方图的存在, 我的理解是, 把列上的值的分布情况告诉cbo, 而且通常是因为这个列上的值分布并不均匀.
如果一个列唯一, 统计直方图没有意义.
因为user_tab_columns里的density, num_rows,low_value,high_value就足以描述这个字段的值的分布情况了.

使用道具 举报

回复
论坛徽章:
14
数据库板块每日发贴之星
日期:2005-05-15 01:01:24生肖徽章2007版:鸡
日期:2009-11-17 15:01:30生肖徽章2007版:马
日期:2009-10-22 08:53:062009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2008-12-28 01:01:02ERP板块每日发贴之星
日期:2008-11-29 01:01:04数据库板块每日发贴之星
日期:2008-04-25 01:01:54生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
13#
发表于 2008-4-7 17:50 | 只看该作者
原帖由 mihawk 于 2008-4-7 17:26 发表
我认为可能的原因有两个,

1. 因为你使用的是常量来查询, 所以cbo会使用直方图来估算会得到多少笔记录, 从而计算使用index的cost是多少, 这个时候如果直方图不准确, 可能就会导致计算出来的索引扫描成本高于table scan的成本, 最后cbo就会选择成本较低的table scan.

2.直方图是准确的, 确实你这个sql返回的记录集很大, 应该走table scan更合理.这个可以通过hint指定索引, set trace on来确定. 到底应该走索引还是应该走全表扫描.

不过可以简单估算一下, 20080301~20080310之间有64200笔记录, 索引扫描总成本为49885.
而20080301~20080320之间有183144笔记录, 如果简单按比例来算的话扫描成本是 49885/64200*183144=142307.
而cbo估算的全表扫描成本是90365.
所以cbo选择了全表扫描, 成本9w, 比索引扫描的成本14w要小.

使用道具 举报

回复
论坛徽章:
5
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53奥运会纪念徽章:羽毛球
日期:2008-06-23 12:00:05奥运会纪念徽章:柔道
日期:2008-07-04 09:42:36奥运会纪念徽章:皮划艇激流回旋
日期:2008-08-12 14:50:402010新春纪念徽章
日期:2010-03-01 11:19:07
14#
发表于 2008-4-8 09:31 | 只看该作者
我又重新分析了lz提供的数据, 发现问题可能出在另一个地方.
那就是cbo对全表扫描成本的计算.
应该说cbo计算出的cost跟实际执行时trace的逻辑读应该是线性关系的,
就是说cost大的执行计划, 实际执行的逻辑读多.
但是看如下的数据:
索引扫描 的cost为 49885  ,逻辑读为 49013  consistent gets.
全表扫描 的cost为 90365, 按照比例的话, 逻辑读应该在9w左右, 但是实际执行全表扫描的逻辑读却是 417438  consistent gets.

而全表扫描成本=表的数据块数/多块读取数 (user_Tables.blocks / db_file_multiblock_read_count)
所以我怀疑user_tables.blocks这个统计信息没有反应当前table的真实情况.
有可能是装载大量数据后没有重新分析table的统计信息.

使用道具 举报

回复

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

本版积分规则 发表回复

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