http://blog.csdn.net/leshami/article/details/23687137

索引质量的高低对数据库整体性能有着直接的影响。良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用高档的硬件配置。因此对于索引在设计之初需要经过反复的测试与考量。那对于已经置于生产环境中的数据库,我们也可以通过查询相关数据字典得到索引的质量的高低,通过这个分析来指导如何改善索引的性能。下面给出了演示以及索引创建的基本指导原则,最后给出了索引质量分析脚本。

1、查看索引质量

 --获取指定schema或表上的索引质量信息报告
gx_adm@CABO3> @idx_quality
Enter value for input_owner: GX_ADM
Enter value for input_tbname: CLIENT_TRADE_TBL -->如果我们省略具体的表名则会输出整个schema的索引质量报告 Table Table Index Data Blks Leaf Blks Clust Index
Table Rows Blocks Index Size MB per Key per Key Factor Quality
------------------------- ------------ ---------- ------------------------- ------- --------- --------- ------------ -------------
CLIENT_TRADE_TBL 6,318,035 278488 I_TDCL_ARC_STL_DATE_STOCK 62 312 13 171,017 5-Excellent
I_TDCL_ARC_STL_DATE_CASH 62 318 13 174,599 5-Excellent
I_TDCL_ARC_CANCEL_DATE 83 238 8 288,678 5-Excellent
I_TDCL_ARC_INPUT_DATE 144 249 13 310,974 5-Excellent
I_TDCL_ARC_TRADE_DATE 144 269 14 337,097 5-Excellent
PK_CLIENT_TRADE_TBL 200 1 1 798,216 2-Good
I_TDCL_ARC_GRP_REF_ID 144 1 1 811,468 2-Good
UNI_TDCL_ARC_REF_ID 136 1 1 765,603 2-Good
I_TDCL_ARC_CONTRACT_NUM 72 1 1 834,491 2-Good
I_TDCL_ARC_SETTLED_DATE 61 299 5 380,699 1-Poor
I_TDCL_ARC_ACC_NUM 184 624 3 3,899,446 1-Poor
I_TDCL_ARC_PL_STK 176 218 1 4,348,804 1-Poor
I_TDCL_ARC_INSTRU_ID 120 2,667 8 4,273,038 1-Poor --从上面的单表输出的索引质量可知,出现了4个处于Poor级别的索引,也就是说这些个索引具有较大的聚簇因子,几乎接近于表上的行了
--对于这几个索引的质量还应结合该索引的使用频率来考量该索引存在的必要性
--对于聚簇因子,只能通过重新组织表上的数据来,以及调整相应索引列的顺序得以改善 --查询单表上索引列的相关信息
gx_adm@CABO3> @idx_info
Enter value for owner: GX_ADM
Enter value for table_name: CLIENT_TRADE_TBL TABLE_NAME INDEX_NAME CL_NAM CL_POS STATUS IDX_TYP DSCD
------------------------- ------------------------------ -------------------- ------ -------- --------------- ----
CLIENT_TRADE_TBL I_TDCL_ARC_ACC_NUM ACC_NUM 1 VALID NORMAL ASC
I_TDCL_ARC_CANCEL_DATE CANCEL_DATE 1 VALID NORMAL ASC
I_TDCL_ARC_CONTRACT_NUM CONTRACT_NUM 1 VALID NORMAL ASC
I_TDCL_ARC_GRP_REF_ID GRP_REF_ID 1 VALID NORMAL ASC
I_TDCL_ARC_INPUT_DATE INPUT_DATE 1 VALID NORMAL ASC
I_TDCL_ARC_INSTRU_ID INSTRU_ID 1 VALID NORMAL ASC
I_TDCL_ARC_PL_STK STOCK_CD 1 VALID NORMAL ASC
I_TDCL_ARC_PL_STK PL_CD 2 VALID NORMAL ASC
I_TDCL_ARC_SETTLED_DATE SETTLED_DATE 1 VALID NORMAL ASC
I_TDCL_ARC_STL_DATE_CASH STL_DATE_CASH 1 VALID NORMAL ASC
I_TDCL_ARC_STL_DATE_STOCK STL_DATE_STOCK 1 VALID NORMAL ASC
I_TDCL_ARC_TRADE_DATE TRADE_DATE 1 VALID NORMAL ASC
PK_CLIENT_TRADE_TBL BUSINESS_DATE 1 VALID NORMAL ASC
PK_CLIENT_TRADE_TBL REF_ID 2 VALID NORMAL ASC
UNI_TDCL_ARC_REF_ID REF_ID 1 VALID NORMAL ASC --从上面的查询结果可知,当前表TRADE_CLIENT_TBL上含有13个索引,应该来说该表索引存在一定冗余。
--大多数情况下,单表上6-7个索引是比较理想的。过多的索引导致过大的资源开销,以及降低DML性能。

2、索引创建的基本指导原则

索引的创建应遵循精而少的原则

收集表上所有查询的各种不同组合,找出具有最佳离散度的列(或主键列等)创建单索引

对于频繁读取而缺乏比较理想离散值的列为其创建组合索引

对于组合索引应考虑下列因素来制定合理的索引列顺序,以下优先级别由高到低来作为索引的前导列,第二列等等

  列被使用的频率

  该列是否经常使用“ = ”作为常用查询条件

  列上的离散度

  组合列经常按何种顺序排序

  哪些列会作为附件性列被添加

3、索引质量分析脚本

 --script name: idx_quality.sql     --Author : Leshami  --Blog: http://blog.csdn.net/leshami
--index quality retrieval
SET LINESIZE 145
SET PAGESIZE 1000
SET VERIFY OFF CLEAR COMPUTES
CLEAR BREAKS BREAK ON table_name ON num_rows ON blocks COLUMN owner FORMAT a14 HEADING 'Index owner'
COLUMN table_name FORMAT a25 HEADING 'Table'
COLUMN index_name FORMAT a25 HEADING 'Index'
COLUMN num_rows FORMAT 999G999G990 HEADING 'Table|Rows'
COLUMN MB FORMAT 9G990 HEADING 'Index|Size MB'
COLUMN blocks HEADING 'Table|Blocks'
COLUMN num_blocks FORMAT 9G990 HEADING 'Data|Blocks'
COLUMN avg_data_blocks_per_key FORMAT 999G990 HEADING 'Data Blks|per Key'
COLUMN avg_leaf_blocks_per_key FORMAT 999G990 HEADING 'Leaf Blks|per Key'
COLUMN clustering_factor FORMAT 999G999G990 HEADING 'Clust|Factor'
COLUMN Index_Quality FORMAT A13 HEADING 'Index|Quality' --SPOOL index_quality SELECT i.table_name,
t.num_rows,
t.blocks,
i.index_name,
o.bytes / 1048576 mb,
i.avg_data_blocks_per_key,
i.avg_leaf_blocks_per_key,
i.clustering_factor,
CASE
WHEN NVL (i.clustering_factor, 0) = 0 THEN '0-No Stats'
WHEN NVL (t.num_rows, 0) = 0 THEN '0-No Stats'
WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) < 6 THEN '5-Excellent'
WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) BETWEEN 7 AND 11 THEN '4-Very Good'
WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) BETWEEN 12 AND 15 THEN '2-Good'
WHEN (ROUND (i.clustering_factor / t.num_rows * 100)) BETWEEN 16 AND 25 THEN '2-Fair'
ELSE '1-Poor'
END
index_quality
FROM dba_indexes i, dba_segments o, dba_tables t
WHERE
-- i.index_name LIKE UPPER ('%&&1%') AND
i.owner = t.owner
AND i.table_name = t.table_name
AND i.owner = o.owner
AND i.index_name = o.segment_name
AND t.owner = UPPER('&input_owner')
AND t.table_name LIKE UPPER('%&input_tbname%')
ORDER BY table_name,
num_rows,
blocks,
index_quality DESC; --SPOOL OFF; ===========================================================================================
--script name: idx_info.sql
--get the index column information by specified table
set linesize 180
col cl_nam format a20
col table_name format a25
col cl_pos format 9
col idx_typ format a15
SELECT b.table_name,
a.index_name,
a.column_name cl_nam,
a.column_position cl_pos,
b.status,
b.index_type idx_typ,
a.descend dscd
FROM dba_ind_columns a, dba_indexes b
WHERE a.index_name = b.index_name
AND owner = upper('&owner')
AND a.table_name LIKE upper('%&table_name%')
ORDER BY 2, 4;

4、相关参考

Oracle 聚簇因子(Clustering factor)

Oracle 索引监控(monitor index)

Oracle 索引监控与外键索引

收集统计信息导致索引被监控

Oracle 监控索引的使用率

NULL 值与索引(一)

NULL 值与索引(二)

函数使得索引列失效

[转]Oracle 索引质量分析的更多相关文章

  1. 41.oracle索引,分析索引,索引碎片整理

    概述 索引分为B树索引和位图索引.我们主要研究B树索引,B树索引如下图(图片源自网络):

  2. Oracle 索引原理分析

    索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是一个独立于表的对象,可以存放在与表不同的表空间中.索引记录中存有索引关键字和指向表中数据的指针(地址).对索引进行的I/O ...

  3. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  4. oracle如何进行索引监控分析和优化

    在生产环境.我们会发现: ① 索引表空间 I/O 非常高     ② "db file sequential read" 等待事件也比较高   这种迹象表明.整个数据库系统.索引的 ...

  5. MySQL高级学习笔记(四):索引优化分析

    文章目录 性能下降 SQL慢 执行时间长 等待时间长 查询语句写的烂 查询数据过多 关联了太多的表,太多join 没有利用到索引 单值 复合 服务器调优及各个参数设置(缓冲.线程数等)(不重要DBA的 ...

  6. Oracle索引重建

    一.前言 Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.有人持不同观点,就是强烈建议不要定期重建索引.索引重建是一个争论不休被不断 ...

  7. Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  8. 【转】Oracle索引的类型

    数据库的应用类型分为 OLTP(OnLine Transaction Processing ,联机事务处理):OLTP是传统关系型数据库的主要应用,其主要面向基本的.日常的事务处理,例如银行交易. O ...

  9. Oracle 索引<七>

    Oracle 索引 管理索引-原理介绍  介绍 索引是用于加速数据存取的数据对象.合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能.索引有很多种我们主要介绍常用的几种: 为什么添加了索 ...

随机推荐

  1. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  2. vim中SnipMate 和 YouCompleteMe 插件触发键 tab 冲突

    花了好几天废了九牛二虎之力终于在win下把ycm插件装上了 然而在配置插件的时候发现snipmate插件与youcompleteme插件会发生tab键冲突 而ycm比较调,直接使snipmate插件完 ...

  3. Python程序练习4--模拟员工信息数据库操作

    1.功能简介 此程序模拟员工信息数据库操作,按照语法输入指令即能实现员工信息的增.删.改.查功能.   2.实现方法 架构: 本程序采用python语言编写,关键在于指令的解析和执行:其中指令解析主要 ...

  4. mysql5.7在windows不能启动的方法及查看数据库大小命令

    1.将mysql目录下的my-default.ini改为my.ini 2.cmd进入mysql的bin目录下 3.执行mysqld --initialize进行初始化(如果mysql目录下已经存在da ...

  5. 使用Java 8中的Stream

    Stream是Java 8 提供的高效操作集合类(Collection)数据的API. 1. 从Iterator到Stream 有一个字符串的list,要统计其中长度大于7的字符串的数量,用迭代来实现 ...

  6. [Hdu1342] Lotto

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1342 题目大意:输出6--13从小到大个数,然后按顺序输出6个数,输出所有种可能. 解题思路:这题难度 ...

  7. [译]ASP.NET Core 2.0 会话状态

    问题 如何在ASP.NET Core 2.0中存储会话状态? 答案 创建一个空项目,修改Startup类的ConfigureServices()方法,添加会话状态服务和它后台的存储服务: public ...

  8. 学习Identity Server 4的预备知识

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

  9. mysql中多个left join子查询写法以及别名用法

    不多说 直接上语句   SELECT     a.id,     a.thumbNail,     a. NAME,     a.marketPrice,     a.memberPrice,     ...

  10. 使用PHPExcel-1.8实现导入

    //使用PHPExcel-1.8实现导入(下载PHPExcel-1.8):导入excel 后缀名必须是.xls1.<form method="post" action=&qu ...