Oracle复合索引规则指南

在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引。在组合索引的使用方面,Oracle有以下特点:

1、 当使用基于规则的优化器**(RBO)**时,只有当组合索引的前导列出现在SQL语句的where子句中时,才会使用到该索引;

2、 在使用Oracle9i之前的基于成本的优化器(CBO)时, 只有当组合索引的前导列出现在SQL语句的where子句中时,才可能会使用到该索引 ,这取决于优化器计算的使用索引的成本和使用全表扫描的成本,Oracle会自动选择成本低的访问路径;

3、 从Oracle9i起,Oracle引入了一种新的索引扫描方式------索引跳跃扫描(index skip scan),这种扫描方式只有基于成本的优化器(CBO)才能使用。这样,当SQL语句的where子句中即使没有组合索引的前导列,并且索引跳跃扫描的成本低于其他扫描方式的成本时,Oracle就会使用该方式扫描组合索引;

4、 Oracle优化器有时会做出错误的选择,因为它再"聪明",也不如我们SQL语句编写人员更清楚表中数据的分布,在这种情况下,通过使用提示**(hint)**,我们可以帮助Oracle优化器作出更好的选择。

1.创建语句

sql 复制代码
CREATE INDEX index_name ON table_name (column1, column2, ...);

在Oracle数据库中,复合索引是基于多个列创建的索引。当查询语句中的WHERE子句条件使用了复合索引中的列,并且满足一定的条件时,Oracle的优化器 会选择使用这个复合索引来提高查询性能。

2. 应用规则

要使复合索引被使用,查询中的条件需要满足以下规则:

**最左前缀规则:**复合索引中的列必须按照索引创建时的顺序出现在查询条件中,且从左到右不能跳过任何列。

例如,如果有一个复合索引是基于列(A, B, C)创建的,那么以下查询条件可以利用这个索引:

sql 复制代码
WHERE A = :value
WHERE A = :value AND B = :value2
WHERE A = :value AND C = :value3
WHERE A = :value AND B = :value2 AND C = :value3

但以下查询条件则不会使用这个索引:

sql 复制代码
WHERE B = :value2(缺少A列)
WHERE A = :value AND C = :value3(跳过了B列)

3. 解释说明

选择性: 索引列的选择性越高,索引被使用的可能性越大。选择性是指不同值的数量与表中总行数的比值。具有高选择性的列(即列中的值分布较为均匀)通常更能受益于索引。
统计信息: Oracle的优化器依赖于统计信息来决定是否使用索引。如果统计信息不准确或过时,优化器可能不会选择最优的执行计划。因此,需要定期收集和维护表还有索引的统计信息。
**查询优化器的决策:**当查询条件满足复合索引的使用规则,查询优化器也可能出于其他原因(如成本估算、执行计划的选择等)而决定不使用索引。

相关推荐
EnCi Zheng25 分钟前
PostgreSQL 实战指南:安装配置、数据类型、索引选型、MVCC 事务与高可用备份全解析
数据库·sql·postgresql·索引·1024程序员节
泡海椒1 小时前
JQuick-SQL REST API 数据接入:应用层调用接口后注册分析表
数据库·sql·1024程序员节
Random Glow1 小时前
聚簇索引 vs 二级索引:回表、覆盖索引、索引下推
数据库·mysql·性能优化·innodb·1024程序员节·索引优化
要开心吖ZSH3 小时前
一次线上锁风暴复盘:号源表大范围 DELETE 的隐患与分批删除改造
数据库·mysql·行锁·1024程序员节·间隙锁·lockwaittimeout
l1t4 小时前
在windows中测试musql数据库
数据库·sqlite·go·1024程序员节
鬼手点金4 小时前
从 API 消息到模型 Token:Chat Template
java·前端·javascript·数据库·人工智能·深度学习·1024程序员节
CRMEB系统商城4 小时前
Redis + 消息队列 + 连接池:CRMEB PRO 性能优化的三驾马车
大数据·数据库·人工智能·小程序·php·1024程序员节
鸽芷咕5 小时前
KingbaseES SQL 调优六步法:定位、诊断、下药、验证,一步都别省
数据库
黄俊懿5 小时前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节