index skip scan 和oracle partition index 未加分区键类似

索引跳过扫描提升了对非前缀列的索引扫描,因为扫描索引块通常比扫描表数据块更快。非前缀索引是指其第一列不包含关键列的索引。

如果将前缀索引想象为类似分区表,
这个概念会更容易理解。在分区对象中,分区键(此处为首列)定义了存储在哪一列的分区数据中。在索引情况下,每个键下方的每一行(前缀列)都会在该键下排序。因此,在对前缀索引进行跳扫描时,前缀值被跳过,非前缀列作为逻辑子索引访问。后列在前缀列内排列,因此可以进行"正常"索引访问,而无需忽略前缀。
在这种情况下,复合指数被逻辑上拆分为更小的子指数。逻辑子索引的数量取决于初始列的基数。因此,即使首列未被用于 where 子句,也可以使用索引。

Applies To

All Users

Summary

This document explains the index skip scan hint usage.

For developers and DBAs who need to know the syntax of the index skip scan hint.

Solution

Index skip scans improve index scans against non-prefix columns since it is often faster to scan index blocks than scanning table data blocks. A non-prefix index is an index which does not contain a key column as its first column.

This concept is easier to understand if one imagines a prefix index to be similar to a partitioned table. In a partitioned object the partition key (in this case the leading column) defines which partition data is stored within. In the index case every row underneath each key (the prefix column) would be ordered under that key. Thus in a skip scan of a prefixed index, the prefixed value is skipped and the non-prefix columns are accessed as logical sub-indexes. The trailing columns are ordered within the prefix column and so a 'normal' index access can be done ignoring the prefix.

In this case a composite index is split logically into smaller subindexes. The number of logical subindexes depends on the cardinality of the initial column. Hence it is now possible to use the index even if the leading column is not used in a where clause.

++Example query and explain plan:++

drop table at2;
create table at2(a varchar2(3),b varchar2(10),c varchar2(5));

begin
for i in 1..1000
loop
insert into at2 values('M', i, 'M');
insert into at2 values('F', i, 'F');
end loop;
end;
/
create index at2_i on at2(a,b,c);
exec dbms_stats.gather_table_stats(OWNNAME => NULL, TABNAME => 'at2',
CASCADE => TRUE, method_opt => 'FOR ALL COLUMNS SIZE 1');

set autotrace traceonly
select * from at2 where b='352';


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 2 | 14 | 3 (0)| 00:00:01 |
|* 1 | INDEX SKIP SCAN | AT2_I | 2 | 14 | 3 (0)| 00:00:01 |

Predicate Information (identified by operation id):

1 - access("B"='352')
filter("B"='352')

set autotrace off

相关推荐
余槐i2 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹2 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo2 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台5 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
花间相见6 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见6 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing20236 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶7 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课7 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析