暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 索引唯一扫描

原创 Asher.HU 2021-02-04
1025


一个索引中唯一扫描最多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)

也可以看看:


8.3.2.2索引唯一扫描如何工作

扫描按顺序搜索索引以查找指定的键。索引唯一扫描在找到第一条记录后立即停止处理,因为不可能有第二条记录。数据库从索引条目中获取行标识,然后检索该行标识所指定的行。

下图说明了索引唯一扫描。该语句19prod_id具有主键索引列中请求产品ID记录

图8-4索引唯一扫描


8.3.2.3索引唯一扫描:示例

本示例使用唯一扫描从products表中检索行

下面的语句查询产品记录19sh.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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
    • 8.3.2.1当优化器考虑索引唯一扫描时
    • 8.3.2.2索引唯一扫描如何工作
    • 8.3.2.3索引唯一扫描:示例