3、集群因子

预备知识:

索引是针对于列提出来的概念。

假设对object_id建立索引,就要将这一列的‘值’和‘rowid’一起放到索引中去。rowid就是表中某一行的物理地址(rowid=数据文件号+块号 【一个extent中rowid的值是递增的】)。

Oracle中表是堆表,表中的数据是无序的,但是索引中的数据是排序的。索引排序是根据键值来排序的。

集群因子是针对于索引提出来的概念。

集群因子:

集群因子是什么?集群因子是怎么算出来的?

索引中存放的是键值+rowid,我们来模拟一个索引的结构:

集群因子:

从排好序的第一行开始,clustering=0

第二行如果和第一行在同一个块中,clustering=0

第三行如果到了第二个块中,clustering=1

第四行如果和第三行在同一个块中,clustering=1

第五行和第四行相比如果又到了另外一个块中,clustering=2

第六行和第五行相比如果又到了另外一个块中,clustering=3

以此类推,直到最后一个块为止。。。

这就是集群因子。

下面的sql能得到每一行的数据文件号、块号:

select

object_id,

dbms_rowid.rowid_relative_fno(rowid) file#,

dbms_rowid.rowid_block_number(rowid) block#,

dbms_rowid.rowid_row_number(rowid) row#

from test where rownum < 20 order by object_id;

集群因子介于表的总行数和表的总块数之间。

集群因子越接近于总行数,说明列在表中分布的很散乱。

集群因子越接近于总块数,说明列在表中的分布很集中,相当于是排过序的。

例如 select * from test where object_id < 1000   这个sql走索引的话需要回表,

最理想的情况下,  2,3,4 .... 999所在的行都在同一个块中,这时候只需要把一个块读到buffer中,只有第一次回表需要物理IO,之后的回表都是逻辑IO

最糟糕的情况下,2,3,4 。。。 999 所在的行都在不同的块中,这时候每次回表都需要将不同的块读取到buffer中,发生物理IO

集群因子的作用:

集群因子是用来衡量 通过索引回表需要多少物理IO的。

怎么消除集群因子的影响呢?

1、把整个的表都放在buffer cache中

2、集群因子对返回数据少的条件没有影响  

3、集群因子影响的时范围扫描。

怎么改变集群因子:

由于一张表中,我们经常在多个列上简历索引,改善了一个索引的集群因子,很有可能导致另外一个索引的集群因子变得更差,因此集群因子基本上是无解的。

既然集群因子是无解的,我们为什么还要了解他呢?

这就涉及到了sql优化的核心思想,sql优化的核心思想就是<<<减少物理IO的扫描次数>>>。

怎么得到一个索引的集群因子:

select index_name,clustering_factor from user_indexes;

原文地址:https://www.cnblogs.com/nathon-wang/p/10332209.html

时间: 2024-10-21 23:19:45

3、集群因子的相关文章

Oracle学习----集群因子(Clustering Factor)

1.集群因子的算法: 通过dbms_rowid.rowid_block_number(rowid)找到记录对应的block 号.索引中记录了rowid,因此oracle 就可以根据索引中的rowid来判断记录是否是在同一个block 中.举个例子,比如说索引中有a,b,c,d,e五个记录,首先比较a,b 是否在同一个block,如果不在同一个block 那么Clustering Factor +1,然后继续比较b,c 同理,如果b,c 不在同一个block,那么Clustering Factor

集群因子(Clustering Factor)

clustering factor是CBO使用的统计信息,用来衡量一个表中的列是否是规则排序存放的. 在通过索引访问表的时候,被用来作为代价评估的指示器.扫描索引的时候,clustering factor记录需要访问的数据块数量. 可以在以下数据字典中查看clustering factor: -ALL|DBA|USER_INDEXES -ALL|DBA|USER_IND_PARTITIONS -ALL|DBA|USER_IND_SUBPARTITIONS 如何计算clustering facto

oracle数据库优化之统计信息

1.统计信息简介 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息.CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划. 在CBO(基于代价的优化器模式)条件下,SQL语句的执行计划由统计信息来决定,若没有统计信息则会采取动态采样的方式决定执行计划!可以说统计信息关乎sql的执行计划是否正确,

PLSQL_性能优化系列15_Oracle Statistics统计信息

2014-12-18 BaoXinjian 一.摘要 Statistic 对Oracle 是非常重要的. 它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Statistic 对Oracle 是非常重要的,它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Oracle Statistic 的收集,可以使用analy

直方图、基数、选择性、群集因子

基本概念 基数(Cardinality) 列唯一键(Distinct_keys)的数量,比如性别,该列只有男女之分,所以这一列基数是2. 选择性(Selectivity) 列唯一键(Distinct_Keys)与行数(Num_Rows)的比值. 直方图 (Histogram)是一种对数据分布质量情况进行描述的工具.它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择. 频率直方图(FREQUENCY HISTOGRAM),当列中

InnoDB关键特性之change buffer

一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主键来访问MySQL表的性能是最好: 1.显式定义主键:primary key 2.隐式定义主键:如果没有指定主键,MySQL自己会默认建立一个主键(rowid隐藏主键) 1.特点 1.表按照主键排好序,数据按照主键顺序存放(核心原因) 2.主键上有一棵树,叶子节点就是数据节点 3.表本身就是索引,表

PLSQL_性能优化系列15_Oracle Index Rebuild索引重建

2014-10-04 BaoXinjian 一.摘要 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述. 1. 重建索引的理由 Oracle的B树索引随着时间的推移变得不平衡(误解) 索

执行计划中cost计算方法

概念: blevel:二元高度=索引高度-1 clustering_factor:集群因子,扫描index scan得出的要扫描的表中block数,clustering_factor<=table blocks 索引扫描的计算公式: cost = blevel + ceil(leaf_blocks *effective index selectivity) + ceil(clustering_factor * effective table selectivity) SQL> select l

0103MySQL中的B-tree索引 USINGWHERE和USING INDEX同时出现

转自博客http://www.amogoo.com/article/4 前提1,为了与时俱进,文中数据库环境为MySQL5.6版本2,为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于MySQL官网提供的示例库employees,可通过 https://launchpad.net/test-db/employees-db-1/1.0.6 自行下载. 基本概念Binary search(二分查找法,折半查找法):是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始