深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
2013-06-05 16:58
543 查看
规则如下:
测试如下:
hr@ORCL> drop table t purge;
Table dropped.
hr@ORCL> create table t as select * from dba_objects;
Table created.
hr@ORCL> alter table t add (object_id_1 number);
Table altered.
hr@ORCL> update t set object_id_1=object_id;
50363 rows updated.
hr@ORCL> commit;
Commit complete.
hr@ORCL> create index idx_t_a on t(object_id);
Index created.
hr@ORCL> create index idx_t_b on t(object_id_1);
Index created.
/* 统计信息相同、意味着同类型执行计划的Cost值会相同*/
hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false);
PL/SQL procedure successfully completed.
/* 叶子块数量相同、CBO按字母顺序在前走索引*/
hr@ORCL> select index_name,leaf_blocks from user_indexes where table_name='T' and index_name in ('IDX_T_A','IDX_T_B');
INDEX_NAME LEAF_BLOCKS
------------------------------ -----------
IDX_T_A 111
IDX_T_B 111
hr@ORCL> set autot trace exp
hr@ORCL> select * from t where object_id=1000 and object_id_1=1000;
Execution Plan
----------------------------------------------------------
Plan hash value: 1194865126
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 98 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 98 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_A | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID_1"=1000)
2 - access("OBJECT_ID"=1000)
/* 把idx_t_b叶子块数量从111改为110*/
hr@ORCL> set autot off
hr@ORCL> exec dbms_stats.set_index_stats(ownname=>'HR',indname=>'IDX_T_B',numlblks=>110);
PL/SQL procedure successfully completed.
hr@ORCL> select index_name,leaf_blocks from user_indexes where table_name='T' and index_name in ('IDX_T_A','IDX_T_B');
INDEX_NAME LEAF_BLOCKS
------------------------------ -----------
IDX_T_A 111
IDX_T_B 110
/* Cost 值相同、CBO 选择叶子块数量较少的索引*/
hr@ORCL> set autot trace exp
hr@ORCL> select * from t where object_id=1000 and object_id_1=1000;
Execution Plan
----------------------------------------------------------
Plan hash value: 3073359464
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 98 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 98 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_B | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=1000)
2 - access("OBJECT_ID_1"=1000)
By David Lin
20113-06-05
Good Luck
测试如下:
hr@ORCL> drop table t purge;
Table dropped.
hr@ORCL> create table t as select * from dba_objects;
Table created.
hr@ORCL> alter table t add (object_id_1 number);
Table altered.
hr@ORCL> update t set object_id_1=object_id;
50363 rows updated.
hr@ORCL> commit;
Commit complete.
hr@ORCL> create index idx_t_a on t(object_id);
Index created.
hr@ORCL> create index idx_t_b on t(object_id_1);
Index created.
/* 统计信息相同、意味着同类型执行计划的Cost值会相同*/
hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false);
PL/SQL procedure successfully completed.
/* 叶子块数量相同、CBO按字母顺序在前走索引*/
hr@ORCL> select index_name,leaf_blocks from user_indexes where table_name='T' and index_name in ('IDX_T_A','IDX_T_B');
INDEX_NAME LEAF_BLOCKS
------------------------------ -----------
IDX_T_A 111
IDX_T_B 111
hr@ORCL> set autot trace exp
hr@ORCL> select * from t where object_id=1000 and object_id_1=1000;
Execution Plan
----------------------------------------------------------
Plan hash value: 1194865126
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 98 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 98 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_A | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID_1"=1000)
2 - access("OBJECT_ID"=1000)
/* 把idx_t_b叶子块数量从111改为110*/
hr@ORCL> set autot off
hr@ORCL> exec dbms_stats.set_index_stats(ownname=>'HR',indname=>'IDX_T_B',numlblks=>110);
PL/SQL procedure successfully completed.
hr@ORCL> select index_name,leaf_blocks from user_indexes where table_name='T' and index_name in ('IDX_T_A','IDX_T_B');
INDEX_NAME LEAF_BLOCKS
------------------------------ -----------
IDX_T_A 111
IDX_T_B 110
/* Cost 值相同、CBO 选择叶子块数量较少的索引*/
hr@ORCL> set autot trace exp
hr@ORCL> select * from t where object_id=1000 and object_id_1=1000;
Execution Plan
----------------------------------------------------------
Plan hash value: 3073359464
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 98 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 98 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_B | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=1000)
2 - access("OBJECT_ID_1"=1000)
By David Lin
20113-06-05
Good Luck
相关文章推荐
- 深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
- 深入理解Oracle索引(21):视图和小表是否应该加索引
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
- 深入理解Oracle索引(22):索引和NULL 协同合作互惠共赢
- 深入理解Oracle索引(8):如何进行索引监控分析和优化
- 深入理解Oracle索引(3):唯一索引和ROWID
- 深入理解Oracle索引(22):索引和NULL 协同合作互惠共赢
- 深入理解Oracle索引(23):6 种常见不走索引的原因分析
- 深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
- 深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
- 深入理解Oracle索引(6):在实践中初步认识3大索引的使用场景
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(23):6 种常见不走索引的原因分析
- 深入理解Oracle索引(15):日期转换函数的格式参数大小写规则对函数索引的影响
- 深入理解Oracle索引(20):外键是否应该加索引
- 统计、案例-深入理解Oracle索引(10):索引列字符类型统计信息的32位限制-by小雨
- 深入理解Oracle索引(5):反向索引的定义、缺点和适用场景