一个索引中唯一扫描最多1个ROWID返回。
8.3.2.1当优化器考虑索引唯一扫描时
索引唯一扫描需要一个相等谓词。
具体来说,仅当查询谓词使用等号运算符引用唯一索引键中的所有列时,数据库才执行唯一扫描WHERE prod_id=10。
唯一键或主键约束本身不足以产生索引唯一扫描,因为列上的非唯一索引可能已经存在。考虑以下示例,该示例创建t_table表,然后在上创建一个非唯一索引numcol:
SQL> CREATE TABLE t_table(numcol INT);
SQL> CREATE INDEX t_table_idx ON t_table(numcol);
SQL> SELECT UNIQUENESS FROM USER_INDEXES WHERE INDEX_NAME = 'T_TABLE_IDX';
UNIQUENES
---------
NONUNIQUE
以下代码在具有非唯一索引的列上创建主键约束,从而导致索引范围扫描而不是索引唯一扫描:
SQL> ALTER TABLE t_table ADD CONSTRAINT t_table_pk PRIMARY KEY(numcol);
SQL> SET AUTOTRACE TRACEONLY EXPLAIN
SQL> SELECT * FROM t_table WHERE numcol = 1;
Execution Plan
----------------------------------------------------------
Plan hash value: 868081059
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| T_TABLE_IDX | 1 | 13 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("NUMCOL"=1)
您可以使用提示指定要使用的索引,但不能指定特定类型的索引访问路径。 INDEX(alias index_name)
也可以看看:
- Oracle Database Concepts 提供有关索引结构的更多详细信息以及有关如何搜索B树的详细信息
- Oracle Database SQL语言参考以了解有关
INDEX提示的 更多信息
8.3.2.2索引唯一扫描如何工作
扫描按顺序搜索索引以查找指定的键。索引唯一扫描在找到第一条记录后立即停止处理,因为不可能有第二条记录。数据库从索引条目中获取行标识,然后检索该行标识所指定的行。
下图说明了索引唯一扫描。该语句19在prod_id具有主键索引的列中请求产品ID记录。
图8-4索引唯一扫描
8.3.2.3索引唯一扫描:示例
本示例使用唯一扫描从products表中检索行。
下面的语句查询产品记录19的sh.products表:
SELECT *
FROM sh.products
WHERE prod_id = 19;
因为products.prod_id列上存在主键索引,并且该WHERE子句使用相等运算符引用所有列,所以优化程序选择唯一扫描:
SQL_ID 3ptq5tsd5vb3d, child number 0
-------------------------------------
select * from sh.products where prod_id = 19
Plan hash value: 4047888317
--------------------------------------------------------------------------------
| Id| Operation | Name |Rows|Bytes|Cost (%CPU)|Time |
--------------------------------------------------------------------------------
| 0| SELECT STATEMENT | | | | 1 (100)| |
| 1| TABLE ACCESS BY INDEX ROWID| PRODUCTS | 1 | 173 | 1 (0)| 00:00:01|
|* 2| INDEX UNIQUE SCAN | PRODUCTS_PK | 1 | | 0 (0)| |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("PROD_ID"=19)「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




