网站制作 深圳,广告公司取名字参考大全,wordpress仿站视频教程,域名注册入口导读 本文介绍一个Oracle 数据库SQL优化的一个基本概念【集群因子】#xff0c;理解了此概念#xff0c;有助于对Oracle数据库进行SQL优化。 1. 集群因子名词解析 集群因子#xff08;ClusteringFactor#xff09;是如果通过一个索引扫描一张表#xff0c;需要访问的表的数… 导读 本文介绍一个Oracle 数据库SQL优化的一个基本概念【集群因子】理解了此概念有助于对Oracle数据库进行SQL优化。 1. 集群因子名词解析 集群因子ClusteringFactor是如果通过一个索引扫描一张表需要访问的表的数据块的数量。衡量通过索引扫描通过ROWID 回表的时候物理读有多大。 集群因子是索引与它所基于的表相比较而得出的有序性度量它用于检查在索引访问之后执行的表查找的成本(将集群因子与选择性相乘即可得到该操作的成本)。集群因子记录在扫描索引时将读取的块数量。 如果使用的索引具有较大的集群因子则必须访问更多的表数据块才可以获得每个索引块中的行(因为邻近行位于不同的块中)。 如果集群因子接近于表中的块数量则表示索引适当排序但是如果集群因子接近于表中的行数量则表示索引没有适当排序 2. 集群因子的计算方法 (1) 扫描一个索引 (2) 比较某行的ROWID和前一行的ROWID如果这两个ROWID不属于同一个数据块那么ClusteringFactor增加1 (3) 整个索引扫描完毕后就得到了该索引的ClusteringFactor。 (4)行链接和行迁移分别需要补1个块。 3. 计算集群因子大小对SQL优化具有重要的意义 如果ClusteringFactor接近于表存储的块数说明这张表是按照索引字段的顺序存储的。 如果集群因子接近于行的数量那说明这张表不是按索引字段顺序存储的。 在计算索引访问成本时集群因子十分有用。Clustering Factor乘以选择性参数selectivity就是访问索引的开销。 如果这个统计数据不能反映出索引的真实情况那么可能会造成优化器错误地选择执行计划。另外如果某张表上的大多数访问是按照某个索引做索引扫描那么将该表的数据按照索引字段的顺序重新组织可以提高该表的访问性能。 集群因子对执行范围扫描的SQL语句产生影响如果集群因子接近数据块数量满足查询要求的数据块的数量就可以少很多这样也增加了数据块已经存在于内存中的可能性。相对于数据块数量大很多的集群因子基于索引列的范围查询需要扫描更多的数据块。 我们知道可以通过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 Factor1这样一直进行下去直到比较了所有的记录。 根据算法我们就可以知道clustering factor 的值介于block 数和表行数之间。如果clustering factor 接近block 数说明表的存储和索引存储排序接近也就是说表中的记录很有序这样在做index range scan 的时候能读取少量的data block 就能得到我们想要的数据代价比较小。如果clustering factor 接近表记录数说明表的存储和索引排序差异很大在做index range scan 的时候会额外读取多个block因为表记录分散代价较高。 4. 查看集群因子的大小 Clustering_factor列是user_indexesdba_indexes视图中的一列该列反应了数据相对已索引的列是否显得有序。 SQL select table_name,index_name,CLUSTERING_FACTOR from user_indexes where table_nameTEST;TABLE_NAME INDEX_NAME CLUSTERING_FACTOR
------------------------------ ------------------------------ -----------------
TEST IDX_OWNER 2353SQL