HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

Oracle SQL提示含义与示例 --- 访问路径提示

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2013-01-08 04:01:57

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

《Oracle 高性能SQL引擎剖析:Oracle SQL 优化与调优技术详解》一书的附录部分。作为对该书的补充,帮助读者理解和掌握“提示”这一项在SQL优化中使用的这一重要辅助手段。

访问路径提示

CLUSTER

语法:CLUSTER([<@查询块>] <>)

描述:指示优化器通过簇来访问表,仅对簇表有效

HELLODBA.COM>exec sql_explain('SELECT /*+cluster(T)*/* FROM T_EEE T where A >:1', 'BASIC OUTLINE');

 

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

| Id  | Operation            | Name        |

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

|   0 | SELECT STATEMENT     |             |

|   1 |  TABLE ACCESS CLUSTER| T_EEE       |

|   2 |   INDEX RANGE SCAN   | C_KEY2_IDX1 |

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

HASH      

语法:HASH([<@查询块>] <表名>)

描述:指示优化器通过哈希簇来访问表,仅对哈希簇表有效

HELLODBA.COM>exec sql_explain('SELECT /*+ hash(a) full(d) */* FROM T_AAA A, T_DDD D WHERE a.c=d.c', 'BASIC OUTLINE');

 

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

| Id  | Operation          | Name  |

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

|   0 | SELECT STATEMENT   |       |

|   1 |  NESTED LOOPS      |       |

|   2 |   TABLE ACCESS FULL| T_DDD |

|   3 |   TABLE ACCESS HASH| T_AAA |

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

ROWID

语法:ROWID([<@查询块>] <>)

描述:指示优化器通过ROWID来访问和扫描表;                           

HELLODBA.COM>exec sql_explain('select /*+rowid(o)*/* from t_objects o where rowid <= :1 and object_id=100', 'BASIC OUTLINE');

 

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

| Id  | Operation                   | Name      |

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

|   0 | SELECT STATEMENT            |           |

|   1 |  TABLE ACCESS BY ROWID RANGE| T_OBJECTS |

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

FULL

语法:FULL([<@查询块>] <>)

描述:指示优化器采用全表扫描的方式访问表

HELLODBA.COM>exec sql_explain('select /*+full(o)*/* from t_objects o where rowid = :1 and object_id>100','BASIC OUTLINE');

 

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

| Id  | Operation         | Name      |

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

|   0 | SELECT STATEMENT  |           |

|   1 |  TABLE ACCESS FULL| T_OBJECTS |

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

INDEX

语法:INDEX([<@查询块>] <> [<索引>]) 或者 INDEX([<@查询块>] <> [(<索引字段列表>)])

描述:指示优化器通过索引来访问和扫描表。

HELLODBA.COM>exec sql_explain('select /*+index(o (object_id))*/* from t_objects o where rowid = :1 and object_id>100','BASIC OUTLINE');

 

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

| Id  | Operation                   | Name         |

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

|   0 | SELECT STATEMENT            |              |

|   1 |  TABLE ACCESS BY INDEX ROWID| T_OBJECTS    |

|   2 |   INDEX RANGE SCAN          | T_OBJECTS_PK |

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

INDEX_ASC

语法:INDEX_ASC([<@查询块>] <> [<索引>]) 或者 INDEX_ASC([<@查询块>] <> [(<索引字段列表>)])

描述:指示优化器通过索引来访问和扫描表,如果是索引范围扫描,则以索引键值的递增顺序扫描索引记录;

示例:(注意输出结果顺序)

HELLODBA.COM>select /*+index_asc(o (object_id))*/object_id, object_name from t_objects o where object_id<5;

 

 OBJECT_ID OBJECT_NAME

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

          2 C_OBJ#

          3 I_OBJ#

          4 TAB$

INDEX_DESC

语法:INDEX_DESC([<@查询块>] <> [<索引>]) 或者 INDEX_DESC([<@查询块>] <> [(<索引字段列表>)])

描述:指示优化器通过索引来访问和扫描表,如果是索引范围扫描,则以索引键值的递减顺序扫描索引记录;

示例:(注意输出结果顺序)

HELLODBA.COM>select /*+index_desc(o (object_id))*/object_id, object_name from t_objects o where object_id<5;

 

 OBJECT_ID OBJECT_NAME

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

         4 TAB$

         3 I_OBJ#

         2 C_OBJ#

NO_INDEX

语法:NO_INDEX([<@查询块>] <> [<索引>]) 或者 NO_INDEX([<@查询块>] <> [(<索引字段列表>)])

描述:禁止优化器使用索引扫描访问表。

HELLODBA.COM>exec sql_explain('select /*+no_index(o t_objects_pk)*/object_id, object_name from t_objects o where object_id < 10', 'BASIC OUTLINE');

 

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

| Id  | Operation            | Name           |

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

|   0 | SELECT STATEMENT     |                |

|   1 |  INDEX FAST FULL SCAN| T_OBJECTS_IDX8 |

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

INDEX_FFS

语法:INDEX_FFS([<@查询块>] <> [<索引>]) 或者 INDEX_FFS([<@查询块>] <> [(<索引字段列表>)])

描述:指示优化器以索引快速完全扫描的方式访问表

HELLODBA.COM>exec sql_explain('SELECT /*+INDEX_FFS(t t_objects_IDX8)*/object_name FROM t_objects t where owner=:A', 'BASIC OUTLINE');

 

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

| Id  | Operation            | Name           |

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

|   0 | SELECT STATEMENT     |                |

|   1 |  INDEX FAST FULL SCAN| T_OBJECTS_IDX8 |

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

NO_INDEX_FFS

语法:NO_INDEX_FFS([<@查询块>] <> [<索引>]) 或者 NO_INDEX_FFS([<@查询块>] <> [(<索引字段列表>)])

描述:禁止优化器使用索引快速完全扫描访问表。

HELLODBA.COM>exec sql_explain('select /*+no_index_ffs(o t_objects_idx8)*/owner, object_name from t_objects o', 'BASIC OUTLINE');

 

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

| Id  | Operation         | Name      |

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

|   0 | SELECT STATEMENT  |           |

|   1 |  TABLE ACCESS FULL| T_OBJECTS |

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

INDEX_RRS

语法:INDEX_RRS([<@查询块>] <