Oracle聚簇因子(Clustering factor,CF)

Oracle 聚簇因子(Clustering factor)




  聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否作为嵌套连接外部表等。如此这般,那到底什么是聚簇因子,那些情况下会影响到聚簇因子,以及如何提高聚簇因子?本文将对此展开描述。

 

1、堆表的存储方式
    Oralce 数据库系统中最普通,最为常用的即为堆表。
    堆表的数据存储方式为无序存储,也就是任意的DML操作都可能使得当前数据块存在可用的空闲空间。
    处于节省空间的考虑,块上的可用空闲空间会被新插入的行填充,而不是按顺序填充到最后被使用的块上。
    上述的操作方式导致了数据的无序性的产生。
    当创建索引时,会根据指定的列按顺序来填充到索引块,缺省的情况下为升序。
    新建或重建索引时,索引列上的顺序是有序的,而表上的顺序是无序的,也就是存在了差异,即表现为聚簇因子。
    
2、什么是聚簇因子(clustering factor/CF)
    聚簇因子是基于表上索引列上的一个值,每一个索引都有一个聚簇因子。
    用于描述索引块上与表块上存储数据在顺序上的相似程度,也就说表上的数据行的存储顺序与索引列上顺序是否一致。
    在全索引扫描中,CF的值基本上等同于物理I/O或块访问数,如果相同的块被连续读,则Oracle认为只需要1次物理I/O。
    好的CF值接近于表上的块数,而差的CF值则接近于表上的行数。
    聚簇因子在索引创建时就会通过表上存存在的行以及索引块计算获得。

 

3、Oracle 如何计算聚簇因子
    执行或预估一次全索引扫描。
    检查索引块上每一个rowid的值,查看是否前一个rowid的值与后一个指向了相同的数据块,如果指向了不相同的数据块则CF的值增加1。
    当索引块上的每一个rowid被检查完毕,即得到最终的CF值。

 

4、聚簇因子图示

a、良好的索引与聚簇因子的情形

   

b、良好的索引、差的聚簇因子的情形

        

c、差的索引、差的聚簇因子的情形

       

 

5、影响聚簇因子的情形
    当插入到表的数据与索引的顺序相同时,可以提高聚簇因子(接近表上的块数)。
    因此,任意影响该顺序的情形都将导致索引列上的聚簇因子变差。
    如列的顺序,反向索引,空闲列表或空闲列表组。

6、提高聚簇因子
    堆表的数据存储是无序存储,因此需要使无序变为有序。下面是提高聚簇因子的办法。
    a、对于表上的多个索引以及组合索引的情形,索引的创建应考虑按应该按照经常频繁读取的大范围数据的读取顺序来创建索引。
    b、定期重构表(针对堆表),也就是使得表与索引上的数据顺序更接近。注意,是重构表,而不是重建索引。
       重建索引并不能显剧提高CF的值,因为索引列通常是有序的,无序的是原始表上的数据。
       提取原始表上的数据到一个临时表,禁用依赖于该表的相关约束,truncate原始表,再将临时表的数据按索引访问顺序填充到原始表。

    c、使用聚簇表来代替堆表。

 

7、实战聚簇因子随索引结构变化的情形

  

 

  1.   
  2. >      <  
  3.   
  4.   
  5.   
  6.          
  7.   
  8.   
  9.   
  10. >             
  11.   
  12. >       >  
  13.   
  14. >           >  
  15.   
  16. >  >  
  17.   
  18.      
  19.   
  20. >   
  21.       
  22.       
  23.   
  24.                                                 
  25.                                            
  26.            
  27.                                                                          
  28.                                                                          
  29.   
  30.   
  31.   
  32.   
  33.   
  34.   
  35.   
  36.   
  37.   
  38.   
  39. >         
  40.   
  41. >         
  42.   
  43. >  >  
  44.   
  45.      
  46.   
  47. >   
  48.       
  49.       
  50.   
  51.                                                             
  52.                                               
  53.            
  54.                                                                             
  55.                                                                             
  56.                                                                          
  57.                                                                        
  58.   
  59.   
  60.    
  61.    
  62.   
  63.   
  64.   
  65.   
  66.   
  67. >           
  68.   
  69. >        >  
  70.   
  71. >  >  
  72.   
  73.      
  74.   
  75. >   
  76.       
  77.       
  78.   
  79.                                                      
  80.                                                 
  81.            
  82.                                                                     
  83.   
  84.   
  85.   
  86.   

  

 

  1.   
  2. >    >  
  3.   
  4.    
  5.   
  6. >            >  
  7.       
  8.       
  9.   
  10.                                                             
  11.                                             
  12.            
  13.                                                                 
  14.   
  15.   
  16.   
  17. >           >  <  
  18.   
  19. >      >  <  >  
  20.   
  21. >        
  22.   
  23. >  
  24. >        
  25.       
  26.       
  27.   
  28.                                                  
  29.                                              
  30.            
  31.                                                                  
  32.   
  33. >  >   >  
  34.   
  35. >           >  
  36.                   
  37.       
  38.   
  39.                                                 
  40.                                             
  41.            
  42.                                                                  
  43.   
  44. >     
  45. >          >  <  
  46.         
  47.     
  48. >          >  <  
  49.         
  50.   
  51. >  >  >  
  52.   
  53. >      >  
  54.       
  55.       
  56.   
  57.                                                 
  58.                                             
  59.            
  60.                                                                
  61.      
  62.    
  63. >          
  64.   
  65. >    >   
  66.       
  67.       
  68.   
  69.                                                  
  70.                                              
  71.            
  72.                                                                 
  73.   
  74. >  
  75. >  
  76. >  >  
  77.  >   
  78.   
  79.   
  80.      
  81.               
  82.       
  83.       
  84.      
  85.   
  86. >        >  
  87.   
  88. >  >  >  
  89.   
  90.      
  91.   
  92. >   >  
  93.       
  94.       
  95.   
  96.                                                 
  97.                                             
  98.            
  99.                                                                
  100.   
  101.   
  102. >  
  103. >      >  
  104.   
  105. >              
  106.   
  107. >        
  108.   
  109. >             
  110.   
  111. >  >  
  112.   
  113. >     >  
  114.       
  115.       
  116.   
  117.     
  118.       
  119.   
  120.                                                    
  121.                                                
  122.            
  123.                                                                
  124.   
  125.   
  126. >  
  127. >     
  128. >            
  129.   
  130.     
  131.   
  132.    
  133.   
  134.      
  135.   
  136.   
  137.                                                 
  138.   
  139.                                                 
  140.                                
  141.                                          
  142.   
  143.   
  144.        
  145.   
  146.   
  147.      >  <  
  148.   
  149.   
  150.   
  151.                
  152.                 
  153.             
  154.              
  155.              
  156.               
  157.                 
  158.                
  159.                
  160.                
  161.             
  162.   
  163.      
  164.   
  165. >            
  166.   
  167.     
  168.   
  169.    
  170.   
  171.      
  172.   
  173.   
  174.                                                     
  175.   
  176.                                                      
  177.                                 
  178.                                          
  179.   
  180.   
  181.        
  182.   
  183.   
  184.      >  <  
  185.   
  186.   
  187.   
  188.                
  189.                 
  190.              
  191.               
  192.                
  193.               
  194.                 
  195.                
  196.                
  197.                
  198.             
  199.   
  200.        
  201.                
  202. >   
  203. >     

 
 
 
 
 
 
 
 
 
   



>

 
 

&
&

  

  

  

  

   

   

   

   

   

      

      

      

  

  

  

  

   

   

   

      

      

      

      

 

 
 >
  
 
 
 
  
  
 >
  
 
  
 
 >
     
      
     
    
   
   
  
 
  
 >
  
  
 
   
  
 
 >
 >
 >
 >
  
      
 
             
  
 
 >
  
 
  
 
 >
  
          
 
                   
 
 >
  
     
 
            
  
 
 >>
  
 
  
 
 >
  
    
 
              
  
 
 >
  
 
  
 >
  
 
 
 
  
 
           
 
                  
            
                
 
  
 
  
 
 
  
  
   
  
         
  
 >
  
 
  
 >
 
 >><
  
 
  
  
 

 

       

        
      

 

 
  <>
 
 

    
    
  
  
    
  
   
   
    
    
      
 
>
 

 
 
>><
 

 
 

 

            

               
         
              

 

 
  ><
 
 

     
     
   
    
     
   
   
    
     
     
     

  

 
 
 >
  
 
  
 >
  
 
  
 >
  
 
  
 >
  
 
  
 >
  
 
  
 >
  
 
  
 
 >
  
       
 
              
  
 >
  
          
 
                   
  
 >
  
   
 
          
  
 
 >
  
 
  
 
 >
  
     
 
             
  
 >>
  
 
  
 >
  
   
 
     
  
 >
  
         
 
            
  
 >
  
 
  
 >
 
 >><
  
 
  
  
 
 
 
  
 
             
 
                
          
               
 
  
 
 
  
   ><
  
  
 
 
     
    
   
   
    
  
   
   
    
    
   
 

 

  





 

>

>

 >

 >

  

 

 

        

                                              

 

 

 


>

>

                                  

                                         

                          

                         

  

          

          

          

          

          

          

          

          

          

          

          

 


>

>

>

>

>

>

>

>

>

 

 


>

>

              

                    

               

  

          

          

          

          

          

          

          

          

          

          

          

 


>

  

  

 

        

                                          

 


>

 

>


>

>

><

                           

                      

                      

                      

                      

                      

                      

                      

                      

              

 


>

>

                                  

                                        

                         

                        

  

          

          

          

          

          

          

          

          

          

          

          


> 
     

        

                                           

 



    

时间: 2024-09-11 17:14:24

Oracle聚簇因子(Clustering factor,CF)的相关文章

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

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

Oracle聚簇因子

1.聚簇因子(clustering_factor):是使用B树索引进行区间扫描的成本很重要因素,反映数据在表中分布的随机程度 2.聚簇因子的计算方法: ①扫描索引 ②比较某行的ROWID和前一行的ROWID,如果这两个ROWID不属于同一个数据块,那么聚簇因子增加1  --对选择最优查询路径影响最大的只有列的选择率和聚簇因子 3.实验测试 create table t1 as select trunc((rownum-1)/100) id, rpad(rownum,100) t_pad from

聚簇因子和执行计划的联系

在平时的工作中,可能会碰到一种很奇怪的问题,本来在生产环境中有些sql语句执行没有问题,一个很普通的查询预期走了索引扫面,但是拷贝数据到其它环境之后,就发现却走了全表扫描. 或者情况相反,本来出现问题的查询走了全表扫描,我们尝试在测试环境中浮现,但是测试环境中在相同的数据量的情况下,查询却又走了索引扫描,问题无法复现了. 出现这种情况的原因比较复杂,涉及很多的原因,其中一个很重要的原因就是聚簇因子的导致的. 聚簇因子是一个与索引相关的统计信息,它通过查看表中的数据块来进行计算得到. 对于这个问题

oracle聚簇因子对查询性能的影响

create table t0 ( sid int not null , sname varchar2(20) ) tablespace test; --循环导入数据 declare        maxrecords constant int:=100000;        i int :=1;    begin        for i in 1..maxrecords loop          insert into t0 values(i,'ocpyang'||i);        e

Oracle数据库索引聚簇与哈希聚簇使用指南

索引聚簇的使用: ◆对经常在连接语句中访问的表建立聚簇. ◆假如表只是偶尔被连接或者它们的公共列经常被修改,则不要聚簇表.(修改记录的聚簇键值比在 非聚簇的表中修改此值要花费更多的时间,因为Oracle必须将修改的记录移植到其他的块中以维护聚簇) . ◆假如经常需要在一个表上进行完全搜索,则不要聚簇这个表(对一个聚簇表进行完全搜索比在非聚 簇表上进行完全搜索的时间长,Oracle可能要读更多的块,因为表是被一起存储的). ◆假如经常从一个父表和相应的子表中查询记录,则考虑给1对多(1:*)关系创

Oracle的分区表和聚簇表

在什么情况下使用聚簇表?是否对比过分区表和聚簇表的性能? 1.所谓聚簇就是指以某个列为基准,把拥有相同聚簇键值的所有行都存储在相同位置上的物理储储方法.把多个表中拥有相同聚簇值的行集中存储在连续位置上的做法,意味着把需要执行表连接的行提前集中存储在了一起,从而能够显著地降低表连接时的数据运输单价. 2.聚簇分为两种: (1)利用聚簇索引来查找数据的聚簇类型称为索引聚簇 (2)利用hash函数来查找数据的聚簇类型称为hash聚簇也称为散列聚簇(注只适合"="相等比较运算符来读取数据) 从

oracle点知识8——索引聚簇和哈希聚簇

原文整理自网络: Oracle支持两种类型的聚簇: 索引聚簇和哈希聚簇 1. 什么是聚簇 聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的.聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点.非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块.一个表最多只能有一个聚簇索引. 2. 使用 Oracle 聚簇索引 聚簇是一种存储表的方法,这些表密切相关并经常一起连接进磁盘的同一区域.例如,表 BOOKSHELF 和BOOKSHELF_

[20130809]12c Clustering Factor.txt

[20130809]12c Clustering Factor.txt 以前在11G以前,如果使用assm,表的CF经常会很大,即使你插入的像顺序号这样的字段,由于多个会话同时操作,插入的数据分布的不同的块中,以顺序号为索引的CF也会变得很大,甚至接近记录的数量.这个在<基于成本的优化>里面也有介绍. 但是在12g可以设置一个参数改善这种情况,做一些测试看看. 参考了Richard Foote大师的blog:http://richardfoote.wordpress.com/2013/05/0

[20130809]12c Clustering Factor(2).txt

[20130809]12c Clustering Factor(2).txt 参考以下链接,自己重复测试: http://richardfoote.wordpress.com/2013/05/14/clustering-factor-calculation-improvement-part-ii-blocks-on-blocks/ 1.测试环境: SQL> @ver BANNER