小伙们日常里有没有被业务和BOSS要求新建索引或是重建索引?他们都想着既快又稳,那么索引在在Oracle上如何实现、新建、重建。原则是什么:

1、新建索引,查询是否高频且慢,索引列是否高选择性,新增索引对写负载的影响是否可接受。

2、重建索引,验证碎片率/B树高度是否超标,测试重建后查询提升是否有15%以上呢。

一、核心索引类型与原理

B*Tree索引(默认)​
  • 结构​:平衡树(根节点→分支节点→叶子节点),叶子节点双向链表存储键值+ROWID
  • 查询效率​:时间复杂度O(log n),千万级数据定位仅需约23次比较
  • 适用场景​:高基数列(比如EMPLOYEE_ID)、范围查询(比如SALARY > 10000)
位图索引
  • 原理​:为每个键值创建位图(0/1标识行存在性),通过位运算(AND/OR)加速组合查询
  • 适用场景​:低基数列(如GENDER)、OLAP系统
函数索引(Oracle 8i就开始引入)​
  • 机制​:对列的函数结果建索引(如UPPER(LAST_NAME))

二、Oracle的index演进:重建机制对比

1. 11g时代:基础重建框架
  • 在线重建初现​:REBUILD ONLINE首次实现DML不阻塞,但首尾需毫秒级表锁(LOCK TABLE IN EXCLUSIVE MODE)
  • 资源消耗大​:并行处理需手动管理(PARALLEL n),临时表空间易爆增(10亿级索引排序易触发multipass)
  • 空间要求高​:需预留1.5倍原索引空间,否则引发ORA-01654
2. 19c增强:稳定与自动化
  • 在线锁优化​:
  • 自治能力引入​:支持自动统计信息收集(DBMS_STATS.AUTO_GATHER),减少手动维护
  • 热重建支持​:RESUMABLE_TIMEOUT支持中断恢复(如空间不足暂停)
3. 23ai革新:AI驱动与智能治理
  • 向量索引革命​:新增VECTOR数据类型,支持AI语义搜索(需启用vector pool内存区)
  • 自治重建升级​:当blevel≥4或碎片率>20%时,自动触发重建(需开启AUTO_INDEX_MAINTENANCE)
  • 资源自适配​:OPTIMIZE_LOAD参数自动平衡I/O与CPU负载(NVMe环境性能提升40%)

三、新建索引方法与场景​

​1. 场景选择与优化原则

单表索引数 ≤ 列数的20%,避免DML性能下降。小表无需索引,全表扫描更快​

​索引类型​

​适用场景​

​优化建议​

​B*Tree​

主键、外键、范围查询

避免在频繁更新的列上创建

​位图索引​

性别、状态等低基数枚举值

仅适用于OLAP,禁用OLTP

​复合索引​

多列组合查询(如WHERE dept_id=10 AND job_id='IT_PROG')

第一列需被WHERE引用

​函数索引​

条件含表达式(如UPPER(last_name)='SMITH')

确保函数稳定性

2. 新建步骤(以HR.EMPLOYEES为例) 
-- 单列B*Tree索引(高频查询列)
CREATE INDEX IDX_EMP_DEPT_lastname ON employees(last_name);
--
SYS@CDB$ROOT> CREATE INDEX IDX_EMP_DEPT_lastname ON HR.employees(last_name);
Index IDX_EMP_DEPT_LASTNAME created.
-- 复合索引(多列查询,高频条件列在前)
CREATE INDEX IDX_EMP_DEPT_dept ON HR.employees(EMPLOYEE_id,department_id);-- 位图索引(低基数列)
ALTER TABLE HR.EMPLOYEES ADD (gender int);--官方schema的sql中建表无性别
CREATE BITMAP INDEX IDX_EMP_DEPT_gender ON HR.employees(gender);

四、索引重建策略与实战分析(以HR.EMPLOYEES为例)​

1. 重建前提与评估
  • 触发条件​:
    • 索引高度 ≥4(SELECT blevel FROM dba_indexes WHERE index_name='IDX_EMP_DEPT_DEPT';)
    • 碎片率 >20%(ANALYZE INDEX idx_name VALIDATE STRUCTURE; → SELECT DEL_LF_ROWS/LF_ROWS FROM index_stats;)
    • 表频繁发生UPDATE/DELETE(如HR.EMPLOYEES的历史数据清理)​
 2. 重建实操流程
-- 步骤1:分析碎片率
ANALYZE INDEX IDX_EMP_DEPT_dept VALIDATE STRUCTURE;
SELECT name, height, DEL_LF_ROWS/LF_ROWS AS frag_ratio FROM index_stats;
-- 若frag_ratio>0.2则需重建
SYS@CDB$ROOT> ANALYZE INDEX IDX_EMP_DEPT_DEPT VALIDATE STRUCTURE;
Index IDX_EMP_DEPT_DEPT analyzed.
NAME               HEIGHT    FRAG_RATIO
_______________ _________ _____________
IDX_EMP_DEPT_DEPT            1             0-- 步骤2:在线重建(避免阻塞DML)
ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE TABLESPACE HR_data;
SYS@CDB$ROOT> ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE TABLESPACE HR_data;
Index IDX_EMP_DEPT_DEPT altered.-- 步骤3:验证效果  
-- 检查是否走索引
EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id=60;ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE;
SYS@CDB$ROOT> ALTER INDEX IDX_EMP_DEPT_dept REBUILD ONLINE;
Index IDX_EMP_DEPT_DEPT altered.--迁移索引位置:TABLESPACE从HR_DATA 索引重建到SH_data
ALTER INDEX IDX_EMP_DEPT_DEPT REBUILD TABLESPACE SH_DATA;
SYS@CDB$ROOT> ALTER INDEX IDX_EMP_DEPT_DEPT REBUILD TABLESPACE SH_DATA;
Index IDX_EMP_DEPT_DEPT altered.--性能优化参数​PARALLEL n**​启用并行进程(建议值为CPU核数50%-70%)
ALTER INDEX IDX_EMP_DEPT REBUILD PARALLEL 8;--STORAGE**​调整物理存储属性(需在重建前规划)
ALTER INDEX IDX_EMP_DEPT REBUILD STORAGE (INITIAL 100M NEXT 50M);--COMPRESS ADVANCED启用高级压缩减少空间占用
ALTER INDEX IDX_EMP_DEPT REBUILD COMPRESS ADVANCED;

五、典型异常与解决方案

1. ​重建失败索引失效(ORA-01502)​​

​现象​:索引状态变为UNUSABLE,查询报错ORA-01502,表空间迁移或手动禁用索引后未重建

-- 检查失效索引
SELECT index_name, status FROM dba_indexes WHERE status='UNUSABLE';-- 重建失效索引
ALTER INDEX IDX_EMP_DEPT REBUILD;
2. ​空间不足(ORA-01654)​​

​预防​:重建前检查表空间,规则​:所需空间 ≈ 原索引大小的1.2倍

SELECT tablespace_name, SUM(bytes)/1024/1024 free_space_mb 
FROM dba_free_space 
GROUP BY tablespace_name;
3. 碎片DBMS包诊断
--基础调用(仅收集索引统计),注意OWNNAME 哪个用户建的
BEGINDBMS_STATS.GATHER_INDEX_STATS(ownname => 'SYS',indname => 'IDX_EMP_DEPT_dept');
END;
/
--扩展参数(采样率 + 并行度)
BEGINDBMS_STATS.GATHER_INDEX_STATS(ownname          => 'SYS',indname          => 'IDX_EMP_DEPT_dept',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自动采样degree           => 4  -- 并行度(建议≤CPU核数));
END;
/
-- 23ai支持JSON输出诊断报告
ANALYZE INDEX emp_name_idx VALIDATE STRUCTURE;
SELECT name, height, ROUND((del_lf_rows/NULLIF(lf_rows,0))*100,2) frag_pct 
FROM index_stats;
4. 重建后必做操作
  • ORA-08104 残留中断
DECLAREisClean BOOLEAN;
BEGIN-- 使用有效参数名,且不传递 cleanup_levelisClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(OBJECT_ID => DBMS_REPAIR.ALL_INDEX_ID,  -- 清理所有中断索引WAIT_FOR_LOCK => DBMS_REPAIR.LOCK_WAIT    -- 默认锁等待策略);
END;
/
--PL/SQL procedure successfully completed.
  • 指定OBJECT_ID修复​
DECLAREisClean BOOLEAN;v_index_id NUMBER := 68100; -- 替换为实际索引的OBJECT_ID(从DBA_OBJECTS查询)
BEGINisClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(v_index_id);
END;
/
---若表上有活跃DML操作,函数可能因无法获取锁而返回FALSE。此时需检查锁竞争
SELECT sid, serial# 
FROM v$session 
WHERE sid IN (SELECT session_id FROM dba_locks WHERE object_id = <索引ID>);

、索引生命周期中索引影响与风险控制

  • 性能收益​: I/O降低:碎片整理后逻辑读减少30%~70%
  • 查询加速:索引高度从4降至2,定位效率提升50%
  • 风险规避​: ​资源占用​:重建过程消耗CPU/IO,需在业务低峰操作
  • 日志压力​:生成大量Redo日志,确保UNDO_RETENTION足够​
  • 创建阶段​:按查询模式精准设计,复合索引列顺序是关键
  • 维护阶段​:
    • 定期监控DBA_INDEXES的BLEVEL和LF_ROWS
    • 优先选择 ​**REBUILD ONLINE**​ 减少业务中断
  • 重建黄金法则​:​“不碎不建”​​:仅当碎片率>20%或高度≥4时重建,避免过度维护。

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

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

相关文章

使用 Rust Clippy 的详细方案

使用 Rust Clippy 的详细方案 Rust Clippy 是一个强大的静态分析工具&#xff0c;帮助开发者识别代码中的潜在问题并改善代码质量。以下是如何充分利用 Clippy 的方法&#xff1a; 安装 Clippy 确保 Rust 工具链已安装。通过以下命令安装 Clippy&#xff1a; rustup compon…

21.什么是JSBridge(1)

1.Native与H5交互的常用交互机制&#xff0c;主流选择是jsbridge 2.jsbridge是什么&#xff1f; JSBridge 是 Android 官方 WebView 提供的 addJavascriptInterface() 能力 项目方&#xff08;或三方库&#xff09;封装的桥梁通信协议。 底层机制由 Android 官方 WebView 提…

什么是Flink

Apache Flink&#xff1a;流批一体的大数据处理引擎 什么是Apache Flink&#xff1f; Apache Flink是一个开源的分布式流处理框架&#xff0c;最初由柏林工业大学开发&#xff0c;后成为Apache软件基金会的顶级项目。它能够以高吞吐、低延迟的方式处理无界数据流(流处理)和有…

区块链+智能合约如何解决上门按摩行业的信任问题?——App开发案例

你是不是觉得上门按摩市场已经人满为患&#xff1f;担心自己入局太晚或者缺乏行业经验&#xff1f;一组真实数据可能会让你改变看法&#xff1a;全国按摩服务需求正以月均8%的速度迅猛增长&#xff0c;但专业技师的供给量仅能跟上5%的增幅&#xff01;这意味着每个月都有相当于…

修改windows hosts文件的软件

修改hosts文件的软件推荐及使用教程 这个软件我用了10多年 推荐工具&#xff1a;Hosts Host软件不用安装绿色 如何使用 注意事项 如何没有安装.net 3.5 请根据提示安装就可以了 内容绑定了软件下载资源&#xff0c;在顶部有需要的自己取

Java web非Maven项目中引入EasyExcel踩坑记录

最近在帮朋友在老项目上做二次开发&#xff0c;有读取Excel的需求&#xff0c;习惯性的引入了EasyExcel&#xff0c;但是出现了很多问题&#xff0c;最主要就是jar包的问题,需要依赖的jar包版本问题 项目技术栈&#xff1a; tomcat9 Amazon Corretto JDK 8 (亚马逊的openJDK…

Flutter——数据库Drift开发详细教程(七)

目录 入门设置 漂移文件入门变量数组定义表支持的列类型漂移特有的功能 导入嵌套结果LIST子查询Dart 互操作SQL 中的 Dart 组件类型转换器现有的行类Dart 文档注释 结果类名称支持的语句 入门 Drift 提供了一个dart_api来定义表和编写 SQL 查询。尤其当您已经熟悉 SQL 时&#…

【排坑指南】MySQL初始化后,Nacos与微服务无法连接??

Date&#xff1a;2025/06/18 你好&#xff01; 今天&#xff0c;分享一个工作中遇到的一个 MySQL 问题。在这之前都不知道是 MySQL 的问题&#xff0c;特离谱&#xff01; 昨天和今天大多数时间都用来处理了这一个问题&#xff1a;《MySQL进行了数据库初始化之后&#xff0c…

springboot获取工程目录

在springboot中使用ApplicationHome获取工程所在目录的时候&#xff0c;开发环境和生产运行环境输出的目录是不同的&#xff0c;开发环境到target/classes目录&#xff0c;而生产运行则是需要的wzkj-server.jar所在目录 ApplicationHome home new ApplicationHome(CollectTas…

深入ZGC并发处理的原理

大型Java应用的核心痛点之一&#xff1a;当JVM进行垃圾回收时强制程序暂停&#xff08;STW&#xff09;的代价。在要求低延迟的应用场景——高频交易系统、实时在线服务或全球性大型平台——中&#xff0c;这种"时空静止"的成本可能极高。但JDK从16版本&#xff08;生…

配置DHCP服务(小白的“升级打怪”成长之路)

目录 项目前准备 一、DHCP服务器配置&#xff08;Rocky8&#xff09; 1&#xff0c;关闭防火墙、安全上下文 2、配置网卡文件 3、安装hdcp-server 4、配置dhcp服务 5、重启dhcp服务 二、配置路由器 1、添加两块网卡并更改网卡配置文件 2、配置路由功能 3、挂载本地镜…

云原生安全

云原生 | T Wiki 以下大部分内容参考了这篇文章 什么是云原生 云原生&#xff08;Cloud Native&#xff09; “云原生”可以从字面上拆解为“云”和“原生”两个部分来理解&#xff1a; “云”&#xff0c;是相对于“本地”而言的。传统应用部署在本地数据中心或物理服务器…

rapidocr v3.2.0发布

粗略更新日志 rapidocr v3.2.0 发布了。令我感到很开心的是&#xff1a;有 3 个小伙伴提了 PR&#xff0c;他们积极参与了进来。 更新要点如下&#xff1a; 采纳了小伙伴qianliyx 的建议&#xff0c;按照行返回单字坐标&#xff1a;同一行的单字坐标是在同一个 tuple 中的。…

Java 操作数类型冲突: varbinary 与 real 不兼容, Java中BigDecimal与SQL Server real类型冲突解决方案

要解决Java中BigDecimal类型与SQL Server中real类型冲突导致的varbinary与real不兼容错误&#xff0c;请按以下步骤操作&#xff1a; 错误原因分析 类型映射错误&#xff1a;JDBC驱动尝试将BigDecimal转换为varbinary&#xff08;二进制类型&#xff09;&#xff0c;而非目标字…

25.多子句查询

MySQL 中包含 GROUP BY、HAVING、ORDER BY、LIMIT 时的查询语法规则及应用&#xff0c;核心知识总结如下&#xff1a; 1.语法顺序规则 当 SELECT 语句同时包含 GROUP BY、HAVING、ORDER BY、LIMIT 时&#xff0c;执行顺序为&#xff1a; GROUP BY → HAVING → ORDER BY → L…

Vue3 × DataV:三步上手炫酷数据可视化组件库

DataV&#xff08;kjgl77/datav-vue3&#xff09;是专为“大屏可视化”场景打造的 Vue3 组件库&#xff0c;提供边框、装饰、等数十个开箱即用的视觉组件。本文聚焦 “在 Vue3 项目中如何正确使用 DataV”&#xff0c;从安装、全局注册到常见坑点&#xff0c;带你迅速玩转这款酷…

本地KMS服务器激活常用命令

OpenWRT内置了KMS激活的相关服务&#xff0c;配置后需要电脑本地切换到该KMS服务。相关命令如下&#xff1a; 基本功能与定义‌ slmgr是Windows内置的软件授权管理工具&#xff0c;全称为Software License Manager。其核心功能包括产品密钥安装/卸载、许可证信息查询、KMS服务器…

存货核算:个别计价法、先进先出法、加权平均法、移动加权平均法解读

存货作为企业资产的重要组成部分&#xff0c;贯穿于企业运营的各个环节&#xff0c;特别是制造业&#xff0c;企业的所有运营体系都是围绕存货来开展的。根据会计准则&#xff0c;存货是指企业在日常活动中持有以备出售的产成品或商品、处在生产过程中的在半成品&#xff0c;以…

Java异步编程:挑战、实践与未来

&#x1f4cc; 摘要 在现代高并发、高性能的系统中&#xff0c;异步编程已经成为构建响应式应用的重要手段。Java 提供了多种异步编程模型&#xff0c;从最基础的 Future 和线程池&#xff0c;到 CompletableFuture 的链式调用&#xff0c;再到反应式框架如 Project Reactor 和…

哈希函数结构:从MD到海绵的进化之路

一、MD结构&#xff1a;哈希函数的经典范式 1. Merkle-Damgrd结构核心原理 #mermaid-svg-BX4ZrTendXiyIVr0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BX4ZrTendXiyIVr0 .error-icon{fill:#552222;}#mermaid-s…