分析Oracle索引,检查其碎片是否严重

本文通过实例演示了Oracle数据库中索引的统计信息收集、结构验证及碎片化处理的方法,并探讨了索引重建的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看表:

  1. train@reg>desc LY_SB_TEST  
  2.  名称                                是否为空? 类型  
  3.  ----------------------------------- -------- ------------------  
  4.  NSR                                          VARCHAR2(44)  
  5.  SSSQ_Q                                       VARCHAR2(8)  
  6.  SSSQ_Z                                       VARCHAR2(8)  
  7.  SE                                           NUMBER  

–LY_SB_TEST总共有36万行数据

train@reg>–索引做统计分析

  1. train@reg>BEGIN  
  2.     DBMS_STATS.GATHER_TABLE_STATS(USER,'LY_SB_TEST',CASCADE => TRUE);  
  3.   END;  
  4.   /  
  5. PL/SQL 过程已成功完成。  

分析索引,验证索引结构

  1. train@reg>analyze index IDX_LY_SB_TEST_N1 validate structure;  
  2.   
  3. 索引已分析  
  4.   
  5. train@reg>select t.name--索引名  
  6.         t.lf_rows, --number of leaf rows (values in the index)  
  7.         t.lf_blks,  
  8.         t.del_lf_rows, --number of deleted leaf rows in the index  
  9.         (t.del_lf_rows / t.lf_rows)*100 ratio --删除比例  
  10.    from index_stats t  
  11.    where t.name='IDX_LY_SB_TEST_N1';  
  12.   
  13. NAME                              LF_ROWS    LF_BLKS DEL_LF_ROWS      RATIO  
  14. ------------------------------ ---------- ---------- ----------- ----------  
  15. IDX_LY_SB_TEST_N1                  360000       1300           0          0  
模拟数据删除,让索引产生大量碎片
  1. train@reg>delete  ly_sb_test where mod(se,3)=1;  
  2.   
  3. 已删除143643行。  
  4.   
  5. train@reg>commit;  
  6.   
  7. 提交完成。  
  8.   
  9. 已用时间:  00: 00: 00.01  
  10. train@reg>--分析索引,查看索引碎片是否严重  
  11. train@reg>  
  12. train@reg>analyze index IDX_LY_SB_TEST_N1 validate structure;  
  13.   
  14. 索引已分析  
  15.   
  16. 已用时间:  00: 00: 00.37  
  17. train@reg>select t.name--索引名  
  18.          t.lf_rows, --number of leaf rows (values in the index)  
  19.          t.lf_blks,  
  20.          t.del_lf_rows, --number of deleted leaf rows in the index  
  21.          (t.del_lf_rows / t.lf_rows)*100 ratio --删除比例  
  22.     from index_stats t  
  23.     where t.name='IDX_LY_SB_TEST_N1';  
  24.   
  25. NAME                              LF_ROWS    LF_BLKS DEL_LF_ROWS      RATIO  
  26. ------------------------------ ---------- ---------- ----------- ----------  
  27. IDX_LY_SB_TEST_N1                  360000       1300      143643 39.9008333  
  28.   
  29. 已用时间:  00: 00: 00.01    

如果RATIO值大于30%以上就需要考虑索引重建了。



From:http://www.idb-stock.net/idb/2011/05/10/66.html



<think>好的,用户想了解Oracle索引的创建、使用和优化。首先,我需要整理现有的引用资料,看看里面有哪些关键点。根据引用[1],索引Oracle维护的可选结构,能加快数据访问,但需要判断何时使用。创建索引时要指定表名和列,Oracle会自动维护。引用[3]提到创建索引的示例,比如在emp表的empno列上创建索引。引用[4]提到位图索引和函数导致索引失效的情况。引用[2]有检查索引状态的SQL,比如查询user_indexes视图。 接下来,我需要把这些信息结构化。首先,创建索引的语法和注意事项,比如选择高选择性的列,避免在小表上创建。然后,使用原则,比如索引列在WHERE或JOIN中,注意隐式转换和函数使用。优化部分需要包括监控索引使用、避免过多索引、重建索引等。常见问题里要提到索引失效的原因,比如函数使用或数据倾斜,以及如何检查状态。 用户可能的问题可能涉及如何创建索引,何时使用位图索引,为什么索引没有被使用,如何优化查询性能等。需要确保回答覆盖这些点,并引用提供的资料。例如,创建索引的示例用引用[3],位图索引提到引用[4],检查索引状态用引用[2]。 还要注意LaTeX格式的要求,行内公式用$...$,独立公式用$$...$$,但这里可能用不上数学公式,主要注意代码块的格式。需要生成相关问题,可能涉及索引类型选择、监控方法、性能调优等。确保回答符合用户需求,结构清晰,引用正确。</think>### Oracle索引的创建、使用与优化指南 #### 一、索引的创建 1. **基本语法** 通过`CREATE INDEX`语句创建,需指定表名和列名: ```sql CREATE INDEX idx_empno ON emp (empno); -- 为emp表的empno列创建索引[^3] ``` *适用场景*:频繁用于查询、连接或排序的列,如主键或外键。 2. **位图索引** 适用于低基数列(唯一值少的列,如性别): ```sql CREATE BITMAP INDEX idx_gender ON employees(gender); -- 位图索引示例[^4] ``` 3. **创建准则** - 优先选择高选择性的列(唯一值比例高)[^1] - 避免在小表或频繁更新的表上过度创建索引 - 组合索引需注意列顺序,高频查询条件列在前 #### 二、索引的使用原则 1. **有效场景** - WHERE子句中的过滤条件:`WHERE deptno = 10` - JOIN操作中的关联字段:`ON emp.deptno = dept.deptno` - ORDER BY/GROUP BY中的排序列 2. **失效场景** - 对索引列使用函数:`WHERE TO_CHAR(hiredate, 'YYYY') = '2020'`[^4] - 隐式类型转换:`WHERE empno = '100'`(empno为数字类型) - 使用`LIKE '%abc'`模糊查询 - 数据倾斜严重时,优化器可能跳过索引 #### 三、索引优化方法 1. **监控索引使用** ```sql SELECT * FROM user_indexes WHERE table_name = 'EMP'; -- 查看索引状态[^2] ``` *重点关注*:`USED`列标记是否被使用,`STATUS`是否有效。 2. **重建失效索引** ```sql ALTER INDEX idx_empno REBUILD; -- 修复索引碎片 ``` 3. **组合索引优化** 将高频组合条件创建为组合索引: ```sql CREATE INDEX idx_emp_dept ON emp(empno, deptno); -- 多列索引 ``` 4. **索引压缩** 对大表启用索引压缩减少存储: ```sql CREATE INDEX idx_name ON employees(last_name) COMPRESS; ``` #### 四、常见问题解决 1. **索引未被使用** - 检查执行计划:`EXPLAIN PLAN FOR [SQL语句]` - 确认统计信息更新:`EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','TABLE')` - 检查查询条件是否触发隐式转换 2. **索引过多导致性能下降** - 定期清理未使用索引:`DROP INDEX idx_unused` - 评估写操作频率,平衡读写性能 3. **位图索引锁冲突** - 仅适用于OLAP系统,OLTP系统建议改用B-tree索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值