Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1693663
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-06-02 09:03:57

通过指定线索,你可以强制使用索引。下面是一个小测试:
 
1. 创建环境:

 

SQL> create table test_index as select * from dba_objects;

 

表已创建。

 

SQL> create index ind_test_index1 on test_index(OWNER, OBJECT_NAME, OBJECT_ID);

 

索引已创建。

 

2. 使用索引的第二列(OBJECT_NAME)作为查询条件,则不会使用索引:

 

SQL> explain plan for

  2  select * from test_index where object_name='adf';

 

已解释。

 

SQL> @?\rdbms\admin\utlxpls

 

PLAN_TABLE_OUTPUT

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

 

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

| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |

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

|   0 | SELECT STATEMENT     |             |       |       |       |

|*  1 |  TABLE ACCESS FULL   | TEST_INDEX  |       |       |       |

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

 

Predicate Information (identified by operation id):

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

 

 

PLAN_TABLE_OUTPUT

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

   1 - filter("TEST_INDEX"."OBJECT_NAME"='adf')

 

Note: rule based optimization

 

已选择14行。

 

3. 通过增加线索来强制使用索引:

 

SQL> explain plan for

  2  select/*+ index (test_index ind_test_index1) */ * from test_index where object_name='adf';

 

已解释。

 

SQL> @?\rdbms\admin\utlxpls

 

PLAN_TABLE_OUTPUT

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

 

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

| Id  | Operation                   |  Name            | Rows  | Bytes | Cost  |

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

|   0 | SELECT STATEMENT            |                  |   329 | 58233 |    34 |

|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_INDEX       |   329 | 58233 |    34 |

|*  2 |   INDEX FULL SCAN           | IND_TEST_INDEX1  |   329 |       |    26 |

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

 

Predicate Information (identified by operation id):

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

 

PLAN_TABLE_OUTPUT

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

 

   2 - access("TEST_INDEX"."OBJECT_NAME"='adf')

       filter("TEST_INDEX"."OBJECT_NAME"='adf')

 

Note: cpu costing is off

 

已选择16行。

 

4. 跳跃索引 — 当存在分析数据时,该测试表会使用跳跃索引:

 

SQL> analyze table test_index compute statistics;

 

表已分析。

 

SQL> explain plan for

  2  select * from test_index where object_name='adf';

 

已解释。

 

SQL> @?\rdbms\admin\utlxpls

 

PLAN_TABLE_OUTPUT

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

 

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

| Id  | Operation                   |  Name            | Rows  | Bytes | Cost  |

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

|   0 | SELECT STATEMENT            |                  |     2 |   172 |    31 |

|   1 |  TABLE ACCESS BY INDEX ROWID| TEST_INDEX       |     2 |   172 |    31 |

|*  2 |   INDEX SKIP SCAN           | IND_TEST_INDEX1  |     1 |       |    30 |

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

 

Predicate Information (identified by operation id):

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

 

PLAN_TABLE_OUTPUT

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

   2 - access("TEST_INDEX"."OBJECT_NAME"='adf')

       filter("TEST_INDEX"."OBJECT_NAME"='adf')

 

Note: cpu costing is off

 

已选择16行。

 
关于跳跃索引,可以参考fuyuncat的《》
阅读(3023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~