一个索引中唯一扫描最多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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
目录