DBA_INDEXES.CLUSTERING_FACTOR 索引的群集因子初探(原)

原创 转载请注明出处

先引出ORACLE WAIT INTERFACE中的原话:

In addition to SQL tuning, it may also be worthwhile to check the index’s clustering factor if the execution plan calls for table access by index rowid. The clustering factor of an index defines how ordered the rows are in the table. It affects the number of I/Os required for the whole operation. If the DBA_INDEXES.CLUSTERING_FACTOR of the index approaches the number of blocks in the table, then most of the rows in the table are ordered. This is desirable. However, if the clustering factor approaches the number of rows in the table, it means the rows in the table are randomly ordered. In this case, it is unlikely for the index entries in the same leaf block to point to rows in the same data block, and thus it requires more I/Os to complete the operation. You can improve the index’s clustering factor by rebuilding the table so that rows are ordered according to the index key and rebuilding the index thereafter. What happens if the table has more than one index? Well, that is the downside. You can only cater to the most used index.

然后给出中文概念:

在索引的分析数据上clustering_factor是一个很重要的参数,表示的是索引和表之间的关系,因为,索引是按照一定的顺序排列的,但是,对于表来说是按照一种heap的形式存放,每一行可能分布在段上任何一个块上,所以要是通过索引来查找数据行的时候,就有可以一个索引块对应多个,甚至全部表的块,所以引入了clustering_factor这个参数来表示表上数据存放和索引之间的对应关系。这样CBO就可以根据这个参数来判断使用这个索引产生的cost是多少。
一般来说,如果这个表的排列是按照索引列的顺序存放数据的话,这个参数就应该和数据表上的块相类似。

然后做简单的试验证明:

1、试验1

SQL> create table test10
  2  as select * from dba_tables;

SQL> create index test10_ind
  2  on test10(SAMPLE_SIZE);

execute dbms_stats.gather_table_stats(ownname => 'sys',tabname => 'TEST10',cascade => true);

SQL>  select  BLOCKS from dba_tables where table_name='TEST10';
 
    BLOCKS
----------
        46

SQL> select dba_indexes.clustering_factor from dba_indexes where dba_indexes.index_name='TEST10_IND';
 
CLUSTERING_FACTOR
-----------------
              496

由于是建立索引的时候是以SAMPLE_SIZE为关键字,这个时候索引会对其排序然后形成一个B-Tree的结构,当然这个时候索引上的一个块也许通过ROWID会访问TABLE上的多个块,所以因子就是496,相差很大。

2、试验2

SQL> create table test11
  2  as
  3  select * from dba_tables order by SAMPLE_SIZE;

SQL> create table index11
  2  on test11(SAMPLE_SIZE);

SQL> execute dbms_stats.gather_table_stats(ownname => 'sys',tabname => 'TEST11',cascade => true);
 SQL>  select  BLOCKS from dba_tables where table_name='TEST11';
 
    BLOCKS
----------
        46

SQL> select dba_indexes.clustering_factor from dba_indexes where dba_indexes.index_name='INDEX11';
 
CLUSTERING_FACTOR
-----------------
               44

这次的试验建立表的时候我使用了索引关键字进行排序,这个时候看到索引的群集因子和表的块数相差不大,除去表中HEADER块,其实是相等的。这个时候索引块一一对应表块,通过索引访问表的I/O也会低,是最好的
 

时间: 2024-09-16 13:53:46

DBA_INDEXES.CLUSTERING_FACTOR 索引的群集因子初探(原)的相关文章

DBA_INDEXES.CLUSTERING_FACTOR 索引的群集因子初探

http://space.itpub.net/?uid-7728585-action-viewspace-itemid-612691 先引出ORACLE WAIT INTERFACE中的原话: In addition to SQL tuning, it may also be worthwhile to check the index's clustering factor if the execution plan calls fortable access by index rowid. T

第十章——维护索引(2)——填充因子

原文:第十章--维护索引(2)--填充因子 前言:        在第九章中,已经介绍了如何使用索引,当一个索引创建时,以B-Tree格式存放数据,拥有根节点.中间节点.叶子节点.叶子节点是最底层的节点,在聚集索引中,包含了实际数据,而每个数据页有8KB.       当表中的数据的增删改发生时,会尝试把数据插入到合适的数据页中.比如有一个聚集索引在SSN上,当插入一个新的SSN数时.SQLServer会尝试把数据插入到合适的数据页,假设SSN从2开始,此时在最后的数据页中找到这个页面是以SSN

《高并发Oracle数据库系统的架构与设计》一2.3 索引设计优化

2.3 索引设计优化 现在,我们知道了B树索引的结构特点,也了解到其对查询和排序优化的意义,但是这并不代表我们就能建好用好索引了.在实际工作中,是不是还是会遇到走了索引反而查询变慢的情况呢?虽然说不是所有的情况下索引扫描都是优于全表扫描的,但是对于一套设计成熟的系统来说,索引扫描往往是值得坚持的,应该定期进行全库SQL语句执行计划的审查,抓出全表扫描的SQL进行优化. 说一千道一万,我们创建索引就是为了使用索引,尽可能地使查询操作能够走索引.但是,很遗憾,不是我们说走索引就能走索引,还是需要取决

一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)

之前的几篇文章: <一个执行计划异常变更的案例 - 前传> <一个执行计划异常变更的案例 - 外传之绑定变量窥探> <一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法> <一个执行计划异常变更的案例 - 外传之rolling invalidation> 这个案例中涉及到了聚簇因子,所以本篇文章是这个系列的又一篇外传,写过上面几篇后,感觉现在就像打怪,见着真正的大BOSS之前,要经历各种小怪的骚扰,之所以写着几篇文章,真是因为这个案例涉及了很多知

用 SQL Server 2000 索引视图提高性能

server|视图|索引|性能 什么是索引视图? 许多年来,Microsoft SQL Server 一直都提供创建虚拟表(称为视图)的功能.在过去,这些视图主要有两种用途: 提供安全机制,将用户限制在一个或多个基表中的数据的某个子集. 提供一种机制,允许开发人员定制用户如何才能以逻辑方式查看存储在基表中的数据. SQL Server 2000 已经扩展了 SQL Server 视图的功能,以提高系统性能.它可以在一个视图上创建唯一的群集索引和非群集索引,可以改进最复杂查询的数据访问性能.在 S

ORACLE关于索引是否需要定期重建争论的整理

     ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网上也有很多争论,也一直让我有点困惑,因为总有点不得庐山真面目的感觉,直到上周看到了一些资料,遂整理于此,方便以后翻阅:   首先来看看网上关于索引需要重建的准则或标准:    一:分析(analyze)指定索引之后,查询index_stats的height字段的值,如果这个值>=4 ,最好

Oracle 重建索引的必要性

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

Oracle关于重建索引争论的总结_oracle

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

教你一招:MSSQL数据库索引的应用

一.索引的概念 索引就是加快检索表中数据的方法.数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库. 二.索引的特点 1.索引可以加快数据库的检索速度 2.索引降低了数据库插入.修改.删除等维护任务的速度 3.索引创建在表上,不能创建在视图上 4.索引既可以直接创建,也可以间接创建 5.可以在优化隐藏中,使用索引 6.使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索