查看: 6287|回复: 11

【讨论】列值分布存在明显偏差执行计划疑问

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-06-13 06:00:13
发表于 2014-6-10 16:28 | 显示全部楼层 |阅读模式
大家好,我做列值分布存在明显偏差对执行计划影响的实验时,遇到一个疑问,希望大家帮助
具体步骤如下:

SQL> select count(1) from abc;

  COUNT(1)
----------
    110102

SQL> select count(1) from abc where aaa=1;

  COUNT(1)
----------
    110001

SQL> analyze table abc compute statistics;

表已分析。

SQL> analyze index idx_aaa compute statistics;

索引已分析

SQL> set autotrace traceonly explain

SQL> select * from abc where aaa=1;
执行计划----------------------------------------------------------Plan hash value: 1033171814
--------------------------------------------------------------------------| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |--------------------------------------------------------------------------|   0 | SELECT STATEMENT  |      |  1001 |  2002 |    63   (2)| 00:00:01 ||*  1 |  TABLE ACCESS FULL| ABC  |  1001 |  2002 |    63   (2)| 00:00:01 |--------------------------------------------------------------------------
Predicate Information (identified by operation id):---------------------------------------------------
   1 - filter("AAA"=1)
Note-----   - SQL plan baseline "SQL_PLAN_8zhr4tj0d4u7d1951b647" used for this statement

SQL> select /*+hint index(abc aaa)*/ * from abc where aaa=1;
执行计划----------------------------------------------------------Plan hash value: 3184639504
----------------------------------------------------------------------------| Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time     |----------------------------------------------------------------------------|   0 | SELECT STATEMENT |         |  1001 |  2002 |     3   (0)| 00:00:01 ||*  1 |  INDEX RANGE SCAN| IDX_AAA |  1001 |  2002 |     3   (0)| 00:00:01 |----------------------------------------------------------------------------
Predicate Information (identified by operation id):---------------------------------------------------
   1 - access("AAA"=1)

在abc表中aaa=1的列值占绝大部分,所以select * from abc where aaa=1;全表扫描这没有问题。但令我不解的是使用hint走索引,预期的cost应该大于全表扫描,但实际结果却是小于,请明白的解释下,尽量详细点,谢谢


论坛徽章:
1
优秀写手
日期:2014-06-13 06:00:13
 楼主| 发表于 2014-6-10 16:34 | 显示全部楼层
重贴下执行计划

select * from abc where aaa=1;
执行计划----------------------------------------------------------Plan hash value: 1033171814
--------------------------------------------------------------------------| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------|   0 | SELECT STATEMENT  |      |  1001 |  2002 |    63   (2)| 00:00:01 |
--------------------------------------------------------------------------|*  1 |  TABLE ACCESS FULL| ABC  |  1001 |  2002 |    63   (2)| 00:00:01 |

Predicate Information (identified by operation id):---------------------------------------------------
   1 - filter("AAA"=1)
Note-----   - SQL plan baseline "SQL_PLAN_8zhr4tj0d4u7d1951b647" used for this statement

select /*+hint index(abc aaa)*/ * from abc where aaa=1;

执行计划----------------------------------------------------------Plan hash value: 3184639504
----------------------------------------------------------------------------| Id  | Operation        | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------|   0 | SELECT STATEMENT |         |  1001 |  2002 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------|*  1 |  INDEX RANGE SCAN| IDX_AAA |  1001 |  2002 |     3   (0)| 00:00:01 |
Predicate Information (identified by operation id):---------------------------------------------------
   1 - access("AAA"=1)

使用道具 举报

回复
认证徽章
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013数据库大会纪念章
日期:2015-03-18 10:16:212014数据库大会纪念章
日期:2015-03-18 10:16:21秀才
日期:2015-07-13 09:55:11金牛座
日期:2015-09-14 18:15:03天蝎座
日期:2015-12-03 09:15:302016猴年福章
日期:2016-02-18 09:31:30猴赛雷
日期:2016-02-18 09:33:422016猴年福章
日期:2016-02-23 09:58:34秀才
日期:2016-03-24 09:20:52
发表于 2014-6-10 16:44 | 显示全部楼层
alter system flush buffer_cache;

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-06-13 06:00:13
 楼主| 发表于 2014-6-10 16:51 | 显示全部楼层
carlos。zh 发表于 2014-6-10 16:44
alter system flush buffer_cache;

没用的,我一开始就重新收集统计信息了,收集统计信息后会重新硬解析

使用道具 举报

回复
论坛徽章:
55
山治
日期:2017-01-03 16:19:442014年新春福章
日期:2014-05-15 10:20:51马上有钱
日期:2014-06-19 14:11:34路虎
日期:2014-06-19 14:11:34马上加薪
日期:2014-06-19 14:11:342014年新春福章
日期:2014-06-19 14:11:34马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08阿斯顿马丁
日期:2014-06-19 14:11:34问答徽章
日期:2013-11-21 09:21:29
发表于 2014-6-10 17:14 | 显示全部楼层
用dbms_stats包重新收集统计信息

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-06-13 06:00:13
 楼主| 发表于 2014-6-10 17:46 | 显示全部楼层
caesar52080 发表于 2014-6-10 16:51
没用的,我一开始就重新收集统计信息了,收集统计信息后会重新硬解析

dbms_stats.gather_table_stats('PDM_COMPARE','ABC',cascade =>TRUE );
重新收集后,select * from abc where aaa=1;执行计划发生变化

执行计划
----------------------------------------------------------
Plan hash value: 1033171814

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |  1001 |  3003 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| ABC  |  1001 |  3003 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("AAA"=1)

使用道具 举报

回复
论坛徽章:
0
发表于 2014-6-10 21:33 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
发表于 2014-6-11 09:58 | 显示全部楼层
NDV是多少?直方图是否没有被收集?

dbms_stats.gather_table_stats('PDM_COMPARE','ABC',cascade =>TRUE,method=>'for all indexed columns');

使用道具 举报

回复
认证徽章
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013数据库大会纪念章
日期:2015-03-18 10:16:212014数据库大会纪念章
日期:2015-03-18 10:16:21秀才
日期:2015-07-13 09:55:11金牛座
日期:2015-09-14 18:15:03天蝎座
日期:2015-12-03 09:15:302016猴年福章
日期:2016-02-18 09:31:30猴赛雷
日期:2016-02-18 09:33:422016猴年福章
日期:2016-02-23 09:58:34秀才
日期:2016-03-24 09:20:52
发表于 2014-6-11 10:53 | 显示全部楼层
caesar52080 发表于 2014-6-10 16:51
没用的,我一开始就重新收集统计信息了,收集统计信息后会重新硬解析

这个不是手机统计信息的事呀,我是说你开始执行的数据已经在buffer cache 里面了

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-06-13 06:00:13
 楼主| 发表于 2014-6-11 17:08 | 显示全部楼层
carlos。zh 发表于 2014-6-11 10:53
这个不是手机统计信息的事呀,我是说你开始执行的数据已经在buffer cache 里面了

和buffer cache没关系吧,解析执行计划都是假设数据块不在buffer cache情况下计算各个路径的cost的

使用道具 举报

回复

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

本版积分规则 发表回复

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