`

oracle index 聚集因子

 
阅读更多
简单看一下clustering_factor
简单的说CLUSTERING_FACTOR 用于INDEX 的有序度和表的混乱度之间比较
b*tree index是经过排序的
例如 INDEX中 记录的第一个rowid指向 表所在DATAFILE 中 BLOCK#1 第1行 计数器 记为1,第2个rowid 指向 BLOCK#2 由于改变了块 所以 计数器加1 ,INDEX 第3个rowid
指向BLOCK#2 块没变 所以计数器还为2,接着沿INDEX执行 第4个rowid 指向BLOCK#1 块又变了计数器加1
计数器对应着CLUSTERING_FACTOR 计数器每次从一个块到另一个新块时候加1 这样CLUSTERING_FACTOR也加一
所以clustering_factor可以描述数据在表中的散布方式
如果clustering_factor接近表中的行数,大多行都不在同一个块中,分布太散
当clustering_factor接近表中的块数,说明数据集中有序

当用INDEX 获取一行以上数据时(INDEX RANGE SCAN),需要遍历INDEX的一部分 叫INDEX的 X%,扫描INDEX 时必须逐行的读取表,那么当遍历INDEX 的 X%时,转换表块的次数就等于clustering_factor 的 X%

 

另外clustering_factor对于oracle 优化器计算index cost 有直接关系


cost =
blevel +
ceiling(leaf_blocks * effective index selectivity) +
ceiling(clustering_factor * effective table selectivity)

 

今天读troubleshooting oracle performance 找到一个直接获取clusering_factor的函数脚本特此记录,仔细看可以发现 计算方式与上面的理论是一样的

SQL> show user
USER is "XH"
SQL> create table t3 (a int ,b int);

Table created.

SQL> declare
  2  begin
  3  for i in 1..10000 loop
  4  insert into t3 values(i,i+1);
  5  end loop;
  6  commit;
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL> create index t3_ind on t3(a);

Index created.

SQL> select clustering_factor from user_ind_statistics where index_name='T3_IND';

CLUSTERING_FACTOR
-----------------
               18

SQL> CREATE OR REPLACE FUNCTION clustering_factor (
  2    p_owner IN VARCHAR2,
  3    p_table_name IN VARCHAR2,
  4    p_column_name IN VARCHAR2
  5  ) RETURN NUMBER IS
  6    l_cursor             SYS_REFCURSOR;
  7    l_clustering_factor  BINARY_INTEGER := 0;
  8    l_block_nr           BINARY_INTEGER := 0;
  9    l_previous_block_nr  BINARY_INTEGER := 0;
 10    l_file_nr            BINARY_INTEGER := 0;
 11    l_previous_file_nr   BINARY_INTEGER := 0;
 12  BEGIN
 13    OPEN l_cursor FOR
 14      'SELECT dbms_rowid.rowid_block_number(rowid) block_nr, '||
 15      '       dbms_rowid.rowid_to_absolute_fno(rowid, '''||
 16                                               p_owner||''','''||
 17                                               p_table_name||''') file_nr '||
 18      'FROM '||p_owner||'.'||p_table_name||' '||
 19      'WHERE '||p_column_name||' IS NOT NULL '||
 20      'ORDER BY ' || p_column_name;
 21    LOOP
    FETCH l_cursor INTO l_block_nr, l_file_nr;
 22   23      EXIT WHEN l_cursor%NOTFOUND;
 24      IF (l_previous_block_nr <> l_block_nr OR l_previous_file_nr <> l_file_nr)
 25      THEN
 26        l_clustering_factor := l_clustering_factor + 1;
 27      END IF;
 28      l_previous_block_nr := l_block_nr;
 29      l_previous_file_nr := l_file_nr;
 30    END LOOP;
 31    CLOSE l_cursor;
 32    RETURN l_clustering_factor;
 33  END;
 34  /

Function created.

SQL> select clustering_factor('XH','T3','A') from dual;

CLUSTERING_FACTOR('XH','T3','A')
--------------------------------
                              18
 
分享到:
评论

相关推荐

    Oracle index

    在Oracle中,可以使用CREATE INDEX语句创建索引,例如: ```sql CREATE INDEX idx_example ON table_name(column_name); ``` 这将在`table_name`表的`column_name`列上创建一个名为`idx_example`的索引。 另外,...

    Oracle自定义聚集函数使用

    在Oracle数据库中,自定义聚集函数为用户提供了高度的灵活性,允许他们根据特定需求创建自己的数据聚合逻辑。本文将深入探讨Oracle自定义聚集函数的实现与应用,包括其四个主要组成部分:`ODCIAggregateInitialize`...

    Oracle B-Tree Index Internals

    ### Oracle B-Tree Index Internals #### 概述 Oracle B-Tree索引是Oracle数据库中最常见的索引类型之一,其高效性和灵活性使其成为许多应用中的首选。B-Tree索引内部结构及其工作原理一直是数据库管理员(DBA)和...

    Oracle_Index 索引

    Oracle_Index 索引

    oracle index

    oracle index orcle 索引优化

    ORACLE 乘积 聚集

    使用自定义聚集函数,实现聚集乘积: 测试select id,fun_multiply(t.value) "乘积" from (select 3 id , 4 value from dual union select 1 id , 1 value from dual union select 1 id , 0 value from dual ...

    oracle index学习总结

    Oracle索引是数据库管理系统中用于加速数据检索的关键结构。...以上内容是根据“oracle index学习总结”文档的摘要,详细内容可参考提供的链接或文档:《oracle index学习总结.doc》和《oracle index学习总结.pdf》。

    Oracle Index Internals.pdf

    ### Oracle Index Internals #### 知识点概览 本文档深入探讨了Oracle数据库中的索引内部机制。主要内容包括各种类型的Oracle索引结构及其实施方式、索引的行为、维护策略以及成本基础优化器如何确定索引的使用...

    从oracle用户取全部索引的方法 index sql

    oracle 用户 全部 索引 all index sql

    ORACLE重建索引总结

    Oracle数据库中的索引是提升查询性能的关键工具,但随着时间推移和数据操作,索引可能会变得效率低下,需要重建以优化其性能。本文主要总结了重建Oracle索引的相关知识点。 一、重建索引的前提条件 当表上的数据...

    Oracle_Index 索引3

    本文将基于标题“Oracle_Index 索引3”及描述“Oracle_Index 索引”,深入探讨Oracle索引的基础知识、B树索引的构造原理及其对数据库性能的影响,旨在帮助读者更全面地理解Oracle索引的运作机制。 #### Oracle索引...

    Oracle数据库使用分组函数来对数据进行聚集

    Oracle数据库使用分组函数来对数据进行聚集

    index索引的8种使用模式

    当查询需要获取基于唯一键的单行数据时,Oracle会使用INDEX UNIQUE SCAN。这种模式确保了结果集中的每行数据都是唯一的,通常用于主键或唯一索引上。例如,当执行以下查询时: ```sql SELECT * FROM t1 WHERE ...

    Oracle数据库精讲之数据库管理_ Oracle数据库管理视频

    第十三讲:oracle index管理 第十四讲:oracle Partitioned Tables and Indexes管理 第十五讲:oracle view管理 第十六讲:oracle sequences管理 第十七讲:oracle 触发器管理 第十八讲:oracle 用户管理 第十九讲:...

    Oracle Instant Client 11.2.0.1.0 轻量级Oracle客户端

    Oracle Instant Client 11.2.0.1.0是轻量级Oracle客户端,用于连接访问Oracle 9i、10g、11g 11.2.0.1.0版本的Oracle数据库。 Oracle Instant Client11.2.0.1.0 安装程序包含OCI/ OCCI、JDBC-OCI SDK(软件开发工具...

    数据库 创建索引 sql oracle

    "数据库创建索引SQL Oracle" 数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面...

    Oracle 9i Database Generic Documentation Master Index Release 2

    Oracle 9i 数据库 Generic Documentation Master Index Release 2 是 Oracle 公司发布的一份重要的数据库文档总索引,该文档旨在为 Oracle 9i 数据库用户提供一个综合的文档索引,帮助他们更好地理解和使用 Oracle ...

    Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer)

    Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer 不用安装Oracle客户端也可以使用PLSQL Developer 绿色! 安全! 轻便! 可靠! 1、本软件可作为简单的Oracle9i客户端...

    基于C#连接Oracle数据库Oracle.ManagedDataAccess

    首先,Oracle.ManagedDataAccess是Oracle公司提供的一个纯.NET框架的客户端驱动,它允许开发者在不安装Oracle客户端的情况下,直接与Oracle数据库进行交互。这个库包含了所有必要的组件,使得C#程序可以方便地执行...

    oracle.jdbc.driver.oracledriver Oracle JDBC驱动包 ojdbc6

    Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...

Global site tag (gtag.js) - Google Analytics