当前位置:  数据库>oracle

Oracle收集索引统计信息

    来源: 互联网  发布时间:2017-05-29

    本文导语: 相信大家对索引结构非常熟悉了,它是由根、支、叶组成。当然这里指的是常用的B+树索引。我们依然使用《Oracle收集表与列统计信息》(见 )里的测试表。下面分析索引统计信息的相关内容。 一、如何查询索引统计信息 查询...

相信大家对索引结构非常熟悉了,它是由根、支、叶组成。当然这里指的是常用的B+树索引。我们依然使用《Oracle收集表与列统计信息》(见 )里的测试表。下面分析索引统计信息的相关内容。

一、如何查询索引统计信息

查询索引统计信息需要用到user_ind_statistics,下面是典型的查询语句。

SELECT INDEX_NAME              AS NAME,
      BLEVEL,
      LEAF_BLOCKS            AS LEAF_BLKS,
      DISTINCT_KEYS          AS DST_KEYS,
      NUM_ROWS,
      CLUSTERING_FACTOR      AS CLUST_FACT,
      AVG_LEAF_BLOCKS_PER_KEY AS LEAF_PER_KEY,
      AVG_DATA_BLOCKS_PER_KEY AS DATA_PER_KEY
  FROM USER_IND_STATISTICS
 WHERE TABLE_NAME = 'T';
 
 NAME          BLEVEL  LEAF_BLKS  DST_KEYS  NUM_ROWS CLUST_FACT LEAF_PER_KEY DATA_PER_KEY
---------- ---------- ---------- ---------- ---------- ---------- ------------ ------------
T_PK                1          2      1000      1000        978            1            1
T_VAL1_I            1          2        445        509        500            1            1
T_VAL2_I            1          3          6      1000        176            1          29

这里的几列具体含义是:

①blevel:也就是B-Tree level,比如从根到支再到叶,blevel为2,但索引的高度是blevel+1也就是3。

②leaf_block:索引中的叶子块数。

③distinct_keys:索引中的唯一键值总数。

④num_rows:索引中的键值数。

⑤clustering_factor:聚簇因子,它用来表征索引和数据之间的排序程度。这个因子的最小值是表里非空数据块的个数,最大值是索引的键数。下面研究如何计算聚簇因子。

二、如何计算聚簇因子

下面是计算聚簇因子的脚本,

CREATE OR REPLACE FUNCTION clustering_factor (
  p_owner IN VARCHAR2,
  p_table_name IN VARCHAR2,
  p_column_name IN VARCHAR2
) RETURN NUMBER IS
  l_cursor            SYS_REFCURSOR;
  l_clustering_factor  BINARY_INTEGER := 0;
  l_block_nr          BINARY_INTEGER := 0;
  l_previous_block_nr  BINARY_INTEGER := 0;
  l_file_nr            BINARY_INTEGER := 0;
  l_previous_file_nr  BINARY_INTEGER := 0;
  BEGIN
  OPEN l_cursor FOR
    'SELECT dbms_rowid.rowid_block_number(rowid) block_nr, '||
    '      dbms_rowid.rowid_to_absolute_fno(rowid, '''||
                                            p_owner||''','''||
                                            p_table_name||''') file_nr '||
    'FROM '||p_owner||'.'||p_table_name||' '||
    'WHERE '||p_column_name||' IS NOT NULL '||
    'ORDER BY ' || p_column_name;
  LOOP
    FETCH l_cursor INTO l_block_nr, l_file_nr;
    EXIT WHEN l_cursor%NOTFOUND;
    IF (l_previous_block_nr l_block_nr OR l_previous_file_nr l_file_nr)
    THEN
      l_clustering_factor := l_clustering_factor + 1;
    END IF;
    l_previous_block_nr := l_block_nr;
    l_previous_file_nr := l_file_nr;
  END LOOP;
  CLOSE l_cursor;
  RETURN l_clustering_factor;
END;
/

这个函数表示的一些含义说明一下,首先定义了一个函数,包含三个参数:所属、表名、列名,还定义了若干个返回值变量。接着定义了一个游标,该游标是根据所传入的参数,返回每条记录所在的块号、文件号。接着遍历游标,提取每一个记录的数据块号与文件号,若数据块号不与前一个数据块号相同,或者文件号不与前一个文件号相同,则聚簇因子加一。

下面验证这个算法的正确性,

SELECT I.INDEX_NAME,
      I.CLUSTERING_FACTOR,
      CLUSTERING_FACTOR(USER, I.TABLE_NAME, IC.COLUMN_NAME) AS MY_CLSTF
  FROM USER_INDEXES I, USER_IND_COLUMNS IC
 WHERE I.TABLE_NAME = 'T'
  AND I.INDEX_NAME = IC.INDEX_NAME;


INDEX_NAME                    CLUSTERING_FACTOR  MY_CLSTF
------------------------------ ----------------- ----------
T_PK                                        972        972
T_VAL1_I                                    506        506
T_VAL2_I                                    178        178

可以看出,结果中用脚本中的函数算出的聚簇因子与oracle自带的clustering_factor列结果完全一致。

相关阅读:

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

Oracle扩展的统计信息 

Oracle确定过期的统计信息

关于Oracle 11g 统计信息的收集

Oracle 收集统计值 收集统计信息


    
 
 

您可能感兴趣的文章:

  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  • Oracle 安装和卸载问题收集(集合篇)第1/6页
  • 收集的ORACLE函数大全
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle中关数据库对象的统计分析
  • oracle数据库下统计专营店的男女数量的语句
  • Oracle统计信息的导出与导入
  • oracle表空间中空表统计方法示例介绍
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • 请问su oracle 和su - oracle有什么不同? iis7站长之家
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,