CBO一个错误的索引选择会带来的后果

在对20亿记录大表的查询中,发现Oracle的执行计划选择并不稳定,当然这是CBO的正常行为,然而当选择不同时,结果是巨大的。

在以下查询中,使用指定的索引,查询快速得出结果,但是这依赖于Hints的强制指定:

SQL> select /*+  index(smsmg IDX_smsmg_DEST_MDN)  */ count(*)

2 from smsmg where msg_to_dest_mdn='861318888888' and service_id='54';

COUNT(*)

----------

1

Elapsed: 00:00:00.00

Execution Plan

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

Plan hash value: 1659057974

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

| Id  | Operation                           | Name                     | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |

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

|   0 | SELECT STATEMENT                    |                          |     1 |    18 |    98   (0)| 00:00:02 |       |       |

|   1 |  SORT AGGREGATE                     |                          |     1 |    18 |            |          |       |       |

|*  2 |   TABLE ACCESS BY GLOBAL INDEX ROWID| smsmg                    |     1 |    18 |    98   (0)| 00:00:02 | ROWID | ROWID |

|*  3 |    INDEX RANGE SCAN                 | IDX_smsmg_msg_to_des_mdn |   106 |       |     4   (0)| 00:00:01 |       |       |

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

Predicate Information (identified by operation id):

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

2 - filter("SERVICE_ID"='54')

3 - access("msg_to_dest_mdn"='861318888888')

Statistics

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

0  recursive calls

0  db block gets

82  consistent gets

0  physical reads

0  redo size

515  bytes sent via SQL*Net to client

469  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1  rows processed

而如果不加Hints,查询是一时无法得出结果的:

SQL> select count(*) from smsmg where msg_to_dest_mdn='861318888888' and service_id='54';

select count(*) from smsmg where msg_to_dest_mdn='861318888888' and service_id='54'

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation

Elapsed: 00:04:27.88

其执行计划显示,这一缺省的执行方式导致了错误的索引选择:

SQL> set autotrace trace explain

SQL> select count(*) from smsmg where msg_to_dest_mdn='861318888888' and service_id='54';

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-11-01 17:52:00

CBO一个错误的索引选择会带来的后果的相关文章

MySQL · 最佳实践 · 一个“异常”的索引选择

背景 在处理一个用户性能问题的时候, 发现有一个全表扫描语句, 上下文如下: 这是很奇怪的, Tips: MySQL在执行条件判断时,若参数类型与字段类型不匹配, 则会作类型转换, 符合转换规则的, 转换完成后可以利用索引 而当参数为字符串,字段类型为整型时, 这个转换是成立的, 比如这个case. 因此我们有必要查一下是什么原因. 分析 在优化器执行流程中, 要选择索引, 需要先判断where的部分的条件操作能否使用索引.经典的有, Tips: 在字段上作函数操作,是无法使用索引的. 比如 w

ORA FAQ 性能调整系列之——当索引第一列由序列产生,一个逆序索引有什么用?

索引|性能 ORA FAQ 性能调整系列之--The Oracle (tm) Users' Co-Operative FAQWhy would a reverse index be useful when the leading column of the index is generated from a sequence ?当索引第一列由序列产生,一个逆序索引有什么用?--------------------------------------------------------------

论MongoDB索引选择的重要性

线上某业务,频繁出现IOPS 使用率100%的(每秒4000IOPS)现象,每次持续接近1个小时,从慢请求的日志发现是一个 getMore 请求耗时1个小时,导致IOPS高:深入调查之后,最终发现竟是一个索引选择的问题. 2017-11-01T15:04:17.498+0800 I COMMAND [conn5735095] command db.mycoll command: getMore { getMore: 215174255789, collection: "mycoll"

排序-关于文件指针的一个错误

问题描述 关于文件指针的一个错误 /************************************************************************************/ /* 著作権所有者 : / /* 文件名 :电子地图管理系统 */ /* 内容 : 对一个二进制地图文件进行处理,排序,检索,更新 */ /* 日期:2015-7-31 */ /* */ /* */ /*********************************************

c程序问题 函数调用-冒泡排序c程序,vc6.0编译提示有一个错误一个警告,但不知为什么错,也不知怎么改

问题描述 冒泡排序c程序,vc6.0编译提示有一个错误一个警告,但不知为什么错,也不知怎么改 程序如下: #include #define TRUE 1 #define FALSE 0 void main() { int i; int a[10]; printf("please input 10 numbers:n"); for(i=0;i { scanf("%d",a[i]); } bubble(a[10],10); for(i=0;i printf("

asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示"处理程序"PageHandlerFactory-Integrated"在其模块列表中有一个错误模块"ManagedPipelineHandler""       我要发布的的web项目开发工具及所用系统 ①开发工具:vs2010.数据库:sqlserver ②操作系统:windows7 ③IIS:I

比尔·盖茨:Ctrl+Alt+Del就是一个错误

比尔·盖茨承认:Ctrl+Alt+Del就是一个错误在比尔盖茨执掌微软的岁月里,做出了数不胜数的英明决策,当然也犯了不少的错误.其中就有"Ctrl+Alt+Delete"这个组合键,其作用大家应该清楚:在BIOS中重启电脑.在电脑运行中进入账号切换. 资源管理器等模块.上周,在哈佛的一个募捐活动中,盖茨坦承:强迫用户用三根手指才能完成这项操作确实是个错误.但随后玩笑似的将错误推给了IBM,"其实设计一个单键实现这个命令是完全可以实现的,但IBM的键盘设计师不想给微软,这才不得

c-链表的一个错误,找了很久也没发现为什么错了。。。

问题描述 链表的一个错误,找了很久也没发现为什么错了... /*随意输入n个数字,作为线性链表,遍历该列表返回输入值最小节点的关键字*/ #include #include #include #include struct example { int input; int keyword; struct example* next; }; typedef struct example EXAMPLE; int main (void) { EXAMPLE* head; EXAMPLE* p; EX

Apache上部署Pro*c常见的一个错误

apache|错误 Apache上部署Pro*c常见的一个错误 在Apache上部署Pro*c,经常会出现服务器500错误.最近测试Linux上的Oracle iAS,遇到问题不少,在这里把解决500错误的过程和大家大致描述一下,希望对大家能有所帮助. 操作系统:RedHat AdvanceServer 2.1数据库: Oracle 8.1.7.4Apache: 1.3.12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++