oracle 索引失效

在 Oracle 11g 中,索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等,解决方法需结合版本特性(如虚拟列、索引跳跃扫描)。通过执行计划分析、统计信息维护和合理使用提示(Hints),可有效优化索引使用。对于关键业务 SQL,建议定期监控并绑定执行计划(SQL Plan Management)

1. 索引列被函数或表达式修改

  • 原因:对索引列使用函数或表达式(如 UPPER(column)column + 1)会导致索引无法匹配。

SELECT * FROM employees WHERE TO_CHAR(hire_date, 'YYYYMMDD') = '20231001';

解决方法

函数索引:为函数或表达式创建专用索引:

CREATE INDEX idx_hire_date_str ON employees(TO_CHAR(hire_date, 'YYYYMMDD'));

2. 复合索引未使用前导列

 

  • 原因:复合索引 (col1, col2) 必须使用 col1 才能生效,否则可能失效。

  • Oracle 11g 优化:支持 索引跳跃扫描(Index Skip Scan),即使未指定前导列,也可能通过跳跃扫描使用索引(但效率较低)。

-- 索引为 (department_id, employee_id)
SELECT * FROM employees WHERE employee_id = 100; -- 可能触发跳跃扫描 

3. 隐式类型转换

  • 原因:查询条件与索引列数据类型不匹配(如字符串 vs 数字)。

-- 索引列 employee_id 是 NUMBER 类型
SELECT * FROM employees WHERE employee_id = '100'; -- 隐式转换为字符串

4. 统计信息过时

  • 原因:Oracle 优化器依赖统计信息计算成本,过时统计信息导致误判。

  • Oracle 11g 特性

    • 自动统计信息收集任务(GATHER_STATS_JOB)默认开启,但可能因业务负载被禁用。

    • 新增增量统计信息收集,适用于分区表。

解决方法

  • 手动收集统计信息:

EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT', tabname => 'EMPLOYEES', cascade => TRUE);

检查自动任务状态:

SELECT * FROM DBA_AUTOTASK_CLIENT WHERE TASK_NAME = 'auto optimizer stats collection';

5. 高比例数据返回

  • 原因:当查询返回超过约 15-20% 的数据时,优化器可能选择全表扫描。

  • 解决方法

使用 INDEX 提示强制使用索引(需谨慎):

 SELECT /*+ INDEX(employees idx_salary) */ * FROM employees WHERE salary > 5000;

6. 使用 != 或 NOT IN 操作符

 

  • 原因:非等值查询可能导致优化器跳过索引。

SELECT * FROM employees WHERE status != 'ACTIVE';

解决方法

 改写为 OR 条件或使用 INDEX_FFS(快速全索引扫描)

SELECT * FROM employees WHERE status = 'INACTIVE' OR status = 'PENDING';

7. 索引被标记为 UNUSABLE

  • 原因:直接路径加载(如 INSERT /*+ APPEND */)或分区维护后,索引可能失效。

检查与修复

-- 检查索引状态
SELECT index_name, status FROM user_indexes WHERE table_name = 'EMPLOYEES';

-- 重建索引
ALTER INDEX idx_emp_name REBUILD;

8. LIKE 以通配符开头

  • 原因LIKE '%abc' 无法利用 B-Tree 索引。

解决方法

  • 反向键索引(Reverse Key Index)

CREATE INDEX idx_name_reverse ON employees(REVERSE(name));
SELECT * FROM employees WHERE REVERSE(name) LIKE REVERSE('%son'); 

9. OR 条件导致索引失效

  • 原因:多个 OR 条件未命中联合索引时,触发全表扫描。

解决方法

 SELECT * FROM employees WHERE dept_id = 10
UNION ALL
SELECT * FROM employees WHERE salary > 10000;

10. 参数设置影响索引选择

  • 关键参数

    • OPTIMIZER_INDEX_COST_ADJ:调整索引访问成本(默认 100),降低该值可能让优化器更倾向索引。

    • OPTIMIZER_INDEX_CACHING:影响嵌套循环连接中索引的缓存成本。

  • 操作建议

    • 非必要不要修改全局参数,可通过提示(Hint)临时调整

 SELECT /*+ OPT_PARAM('optimizer_index_cost_adj', '50') */ * FROM employees WHERE ...;

 11. 位图索引的并发问题

 

  • 原因:位图索引在并发 DML 时易被锁定,导致性能下降或失效。

  • Oracle 11g 优化:支持更多位图索引维护策略,但仍需谨慎使用。

  • 解决方法

    • 在高并发 OLTP 环境中避免使用位图索引。

    • 使用 B-Tree 索引替代。

12. 索引列允许 NULL 值

  • 原因:B-Tree 索引不存储全 NULL 的条目,IS NULL 查询无法使用索引。

  • 解决方法

    • 创建函数索引:

CREATE INDEX idx_comm_null ON employees(NVL(commission_pct, -1));
SELECT * FROM employees WHERE NVL(commission_pct, -1) = -1;

Oracle 11g 特有工具与诊断方法

执行计划分析

EXPLAIN PLAN FOR [your_query];
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

SQL 调优顾问(SQL Tuning Advisor)

 -- 生成调优任务
DECLARE
  l_task VARCHAR2(64);
BEGIN
  l_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_text => 'SELECT * FROM employees WHERE ...');
  DBMS_SQLTUNE.EXECUTE_TUNING_TASK(l_task);
END;
/
-- 查看建议
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('task_name') FROM dual;

 

动态性能视图 

  • V$SQL_PLAN:查看实际执行计划。

  • DBA_IND_STATISTICS:检查索引统计信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/78914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s蓝绿发布

k8s蓝绿发布 什么是蓝绿部署K8S中如何实现蓝绿部署k8s蓝绿部署流程图 什么是蓝绿部署 参考: https://youtu.be/CLq_hA0lAd0 https://help.coding.net/docs/cd/best-practice/blue-green.html 蓝绿部署最早是由马丁福勒 2010年在他的博客中提出. 蓝绿部署是一种软件部署策略,用…

stm32面试

数据结构相关问题 stm32面试 数据结构相关问题 目录基础数据结构树与图排序与查找算法 Linux相关问题Linux系统基础Linux命令与脚本Linux网络与服务 操作系统相关问题操作系统基础概念操作系统调度算法操作系统同步与通信 STM32相关问题STM32硬件基础STM32编程与开发STM32应用与…

Mybatis 中 mappers标签 package的使用

MyBatis 的配置文件中&#xff0c;<mappers> 标签用于指定 MyBatis 应该加载哪些映射器&#xff08;Mapper&#xff09;。其中 package 属性是一种便捷的方式来批量注册多个映射器接口 package 属性允许你指定一个包名&#xff0c;MyBatis 会自动扫描该包下的所有映射器…

设计模式 --- 访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许在不改变对象结构的前提下&#xff0c;定义作用于这些对象元素的新操作。 优点&#xff1a; 1.​​符合开闭原则&#xff1a;新增操作只需添加新的访问者类&#xff0c;无需修改现有对象结构。 ​​2.操作逻辑集中管理​​&am…

监控docker中的java应用

1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […

最新版RubyMine超详细图文安装教程,带补丁包(2025最新版保姆级教程)

目录 前言 一、RubyMine最新版下载 二、RubyMine安装 三、RubyMine补丁 四、运行RubyMine 前言 RubyMine是由JetBrains开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Ruby和Ruby on Rails开发者设计&#xff0c;提供智能代码补全、调试、测试、版本控制集…

数字政府与智慧城市区别报告分析

数字政府与智慧城市区别报告分析 一、引言 随着信息技术的飞速发展&#xff0c;数字政府和智慧城市成为推动城市现代化和治理能力提升的两个重要概念。虽然它们都依托于信息技术&#xff0c;但二者在目标、内涵、实施路径等方面存在显著差异。本文旨在深入探讨数字政府与智慧…

[MRCTF2020]ezpop wp

本题考点:php反序列化的pop链 首先来了解一下pop链是什么,它类似于多米诺骨牌一环套一环,要调用这个成员方法然后去找能调用这个方法的魔术方法,最后一环接一环,完成一个链子,最终形成payload。 那么来了解一下这些魔术方法 __construct() //类的构造函数&#xff0…

spark架构和RDD相关概念

运行架构&#xff1a; Spark采用master - slave结构&#xff0c;Driver作为master负责作业任务调度&#xff0c;Executor作为slave负责实际执行任务。 核心组件 Driver&#xff1a;执行Spark任务的main方法&#xff0c;将用户程序转化为作业&#xff0c;在Executor间调度任务&…

安全是基石

“安全是基石”这句话强调了安全在个人、企业、社会等各个层面中的基础性和不可替代的重要性。无论是物理安全、网络安全、数据安全&#xff0c;还是生产安全、公共安全&#xff0c;都是保障稳定发展的前提。以下是不同领域中“安全”作为基石的体现&#xff1a; 1. 个人安全 基…

Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量

目录 1.make 1.1 make 命令格式 2.Makefile 核心概念‌ ‌ 2.1创建并运行 Makefile步骤 3. Makefile编写 3.1最基础Makefile 3.1.1使用默认make命令 3.1.2使用make -f 命令 3.1.2.1 使用make -f 命令执行默认make操作 3.1.2.2使用 make [ ‐f file ] [ targets ]命令 …

城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同

一、方案背景 1&#xff09;项目背景 在当今数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所&#xff0c;高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…

双Token实现用户登录身份认证-Java版

双Token实现用户登录身份认证-Java版 1. 设计方案 方案概述: Access Token: 短期有效的JWT,包含用户ID、设备ID、token版本号。Refresh Token: 长期有效的令牌,存储于Redis,关联用户信息、设备ID及token版本号,用于刷新Access Token。设备绑定: Token与设备ID绑定,防止跨…

Proteus vs Multisim:电路设计与仿真软件对比

Proteus和Multisim作为两款主流的电路设计与仿真软件&#xff0c;在功能定位和应用场景上既有重叠也有显著差异。以下从多个维度综合阐述两者的异同点&#xff1a; 一、相同点 基础功能 ✅ 电路原理图设计&#xff1a;支持电路设计和仿真分析。 ⚙️ 虚拟仪器&#xff1a;提供…

ssh 三级跳

ssh 三级跳 在网络安全和数据传输领域&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种常用的协议&#xff0c;用于加密两台计算机之间的通信。在某些情况下&#xff0c;你可能需要通过一个中间服务器来间接连接到目标服务器&#xff0c;这通常被称为“三级跳”或“…

Java 性能优化:从原理到实践的全面指南

性能优化是 Java 开发中不可或缺的一环&#xff0c;尤其在高并发、大数据和分布式系统场景下&#xff0c;优化直接影响系统响应速度、资源利用率和用户体验。Java 作为一门成熟的语言&#xff0c;提供了丰富的工具和机制支持性能调优&#xff0c;但优化需要深入理解 JVM、并发模…

【土堆 PyTorch 教程总结】PyTorch入门

目录 一、python学习中两大法宝函数 1、dir() 2、help() 二、PyTorch读取数据集 1、Dataset类 &#xff08;1&#xff09;作用和基本原理 &#xff08;2&#xff09;常见用法 &#xff08;3&#xff09;自定义 Dataset 示例 2、Dataloader类 &#xff08;1&#xff0…

5.DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互:

DJI-PSDK:Psdk开发负载与Msdk的应用app进行交互: 负载设备和无人机使用数据传输模块,在控制命令传输通道上以透传的方式在PSDK和MSDK间传输控制指令。在高速数据传输通道上以透传的方式在PSDK和MSDK间传输数据信息以及用户自定义的数据。使用数据传输功能,不仅可以设置不同…

2025 蓝桥杯省赛c++B组个人题解

声明 本题解为退役蒻苟所写&#xff0c;不保证正确性&#xff0c;仅供参考。 花了大概2个半小时写完&#xff0c;感觉比去年省赛简单&#xff0c;难度大概等价于 codeforces dv4.5 吧 菜鸡不熟悉树上背包&#xff0c;调了一个多小时 题目旁边的是 cf 预测分 所有代码均以通…

Dubbo(53)如何在Spring Boot中集成Dubbo?

在Spring Boot中集成Dubbo可以通过Spring Boot Starter来简化配置&#xff0c;以下是详细的步骤和相关代码示例。 1. 引入依赖 首先&#xff0c;在Spring Boot项目的 pom.xml 中添加Dubbo相关的依赖&#xff1a; <dependencies><!-- Spring Boot Starter --><…