查看: 6577|回复: 16

【讨论】请教同一条SQL执行计划不一致的问题

[复制链接]
求职 : 数据库管理员
论坛徽章:
6
双黄蛋
日期:2012-12-21 14:48:20双黄蛋
日期:2013-01-13 10:17:02大众
日期:2014-01-14 13:23:50优秀写手
日期:2014-04-26 05:59:56马上有对象
日期:2014-11-12 17:24:20马上有车
日期:2015-01-19 17:12:07
跳转到指定楼层
1#
发表于 2014-7-1 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
同一条SQL语句,只有查询条件不一样,查询返回的结果集都为0,一个走了全表扫描,一个走索引。查看全表扫描的SQL语句:

SQL走全表,产生了2422609个逻辑读,cost为535K
SQL> SELECT URL,YHZH,HFRZY,HFLR,SPURL,TPURL,YPURL,SCSJ,LY,JCSJ
FROM YHXX_HFXX T
WHERE T.URL='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1'  2    3  
  4  /
no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 2068618995
-------------------------------------------------------------------------------
| Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |   917K|   266M|   535K  (1)| 01:47:05 |
|*  1 |  TABLE ACCESS FULL| YHXX_HFXX |   917K|   266M|   535K  (1)| 01:47:05 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("T"."URL"='http://club.kdnet.net/dispbbs.asp?id=10165509_b
              oardid=1')

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
    2422609  consistent gets
          3  physical reads
       5520  redo size
        880  bytes sent via SQL*Net to client
        458  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

强制HINT使用索引,产生4个逻辑读,但是cost比全表扫描高:643K
SQL> SELECT  /*+index(YHXX_HFXX IDX_YHXX_HFXX_URL)*/
URL,YHZH,HFRZY,HFLR,SPURL,TPURL,YPURL,SCSJ,LY,JCSJ
FROM YHXX_HFXX
WHERE URL='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1'  2    3    4  
  5  /
no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 518948569
-------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                   |   917K|   266M|   643K  (1)| 02:08:48 |
|   1 |  TABLE ACCESS BY INDEX ROWID| YHXX_HFXX         |   917K|   266M|   643K  (1)| 02:08:48 |
|*  2 |   INDEX RANGE SCAN          | IDX_YHXX_HFXX_URL |   917K|       | 10735   (1)| 00:02:09 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("URL"='http://club.kdnet.net/dispbbs.asp?id=10165509_boardid=1')

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          4  consistent gets
          0  physical reads
          0  redo size
        880  bytes sent via SQL*Net to client
        458  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

请教如何不通过hint或者sql profile的方法让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
2#
发表于 2014-7-1 09:55 | 只看该作者
收集一下表的统计信息, 相信CBO, 不要手工指定Hints, 另外, 如下语句结果是如何的?

select count(*), count(distinct url) from yhxx_hfxx

使用道具 举报

回复
论坛徽章:
90
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
3#
发表于 2014-7-1 10:21 | 只看该作者
url。。。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
4#
发表于 2014-7-1 10:24 | 只看该作者
本帖最后由 lastwinner 于 2014-7-1 10:24 编辑

同2楼,估计是统计信息不准

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
6
双黄蛋
日期:2012-12-21 14:48:20双黄蛋
日期:2013-01-13 10:17:02大众
日期:2014-01-14 13:23:50优秀写手
日期:2014-04-26 05:59:56马上有对象
日期:2014-11-12 17:24:20马上有车
日期:2015-01-19 17:12:07
5#
 楼主| 发表于 2014-7-1 10:26 | 只看该作者
bell6248 发表于 2014-7-1 09:55
收集一下表的统计信息, 相信CBO, 不要手工指定Hints, 另外, 如下语句结果是如何的?

select count(*) ...

我做了表和索引的分析:
exec dbms_stats.gather_table_stats(user,'YHXX_HFXX',cascade=>TRUE);

exec dbms_stats.gather_table_stats(ownname => 'YQJK',tabname => 'YHXX_HFXX',estimate_percent => 10,method_opt => 'for all indexed columns',cascade=>TRUE);

不知道这样的方法对不对

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
6
双黄蛋
日期:2012-12-21 14:48:20双黄蛋
日期:2013-01-13 10:17:02大众
日期:2014-01-14 13:23:50优秀写手
日期:2014-04-26 05:59:56马上有对象
日期:2014-11-12 17:24:20马上有车
日期:2015-01-19 17:12:07
6#
 楼主| 发表于 2014-7-1 10:34 | 只看该作者
lastwinner 发表于 2014-7-1 10:24
同2楼,估计是统计信息不准

SQL基础不好,准备报dataguru怀老师的课程系统学习一下

使用道具 举报

回复
论坛徽章:
90
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
7#
发表于 2014-7-1 10:39 | 只看该作者
lastwinner 发表于 2014-7-1 10:24
同2楼,估计是统计信息不准

统计信息不准,造成执行计划不正确,倒是很正常,
但是他这个索引范围扫描的基数估计竟然也是917k,就比较奇怪了
怀疑是url这个字段搞的鬼。
做了个试验,和楼主的现象一致。
因为直方图默认只取前32个字节进行统计,而url显然是超长的,截取了前32个字节之后,可能大部分或者所有的值就一样了,这样的方法,无论怎么收集统计信息都是没用的。

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
6
双黄蛋
日期:2012-12-21 14:48:20双黄蛋
日期:2013-01-13 10:17:02大众
日期:2014-01-14 13:23:50优秀写手
日期:2014-04-26 05:59:56马上有对象
日期:2014-11-12 17:24:20马上有车
日期:2015-01-19 17:12:07
8#
 楼主| 发表于 2014-7-1 10:56 | 只看该作者
udfrog 发表于 2014-7-1 10:39
统计信息不准,造成执行计划不正确,倒是很正常,
但是他这个索引范围扫描的基数估计竟然也是917k,就比 ...

牛啊,我把查询条件中前32位改动或者删除1位就走索引了。
那就是说只能用SQL PROFILE绑定咯?

使用道具 举报

回复
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
9#
发表于 2014-7-1 23:29 | 只看该作者
udfrog 发表于 2014-7-1 10:39
统计信息不准,造成执行计划不正确,倒是很正常,
但是他这个索引范围扫描的基数估计竟然也是917k,就比 ...

佩服。我也觉得统计信息好像对的。但是不知道哪里出问题了。活到老,学到老啊!

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
10#
发表于 2014-7-2 17:01 | 只看该作者
limengjia 发表于 2014-7-1 10:34
SQL基础不好,准备报dataguru怀老师的课程系统学习一下


提前谢谢支持!

使用道具 举报

回复

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

本版积分规则 发表回复

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