日期:2014-05-16  浏览次数:20571 次

深入理解Oracle优化器(1):倾斜列(skew)和histograms
          ㈠ Histograms
          
          柱状图?直方图?其实这俩是一个概念,在这里Think直接用histograms来称呼
          histograms可以这么理解就是一个列上数值的大致分布的密度(density)和范围(range)
          通俗一些就是CBO用histgrams来更加准确的判断按照某个条件对每一列查询能返回多少记录
          
          histograms有两种类型
          
          ① 基于高度的histograms:每个范围包括相同数量的值,根据每个范围的终点的列值来判断数据的分布
          ② 基于数值的histograms:当列中不同的值的数量少于或等于histograms的buckets数量时,建立数值histograms
                                  这种histograms列中每个值都有对应的bucket,根据每个值对应的bucket的个数来判断数据的分布
          
          我们可以从视图dba_histograms/user_histograms,dba_tab_histograms查询
             
          ① 为什么需要histograms?
             
             我们对经常在WHERE子句中使用的且数据的分布十分不均匀的列使用histograms
             
             直方图究其根本实际上就是一个数据分布的图示,这个图示是为了在生成SQL执行计划的时候给Oracle的CBO更多的信息
             也就是说,当在where条件中的某些列可能由于列值的不同而希望CBO制定出不同的执行计划时,我们需要直方图
             
             那么,什么情况下我们不需要直方图呢?
             
             ⑴ 当此列不用于查询时,也就是这个字段永远不会出现在where条件中
             ⑵ 当此列无论给予什么比较值,我们都希望永远是一种执行计划时,比如,col1我们希望永远是用该列上的索引扫描
                  col2我们希望永远是全表扫描,这样的执行计划的制定,只要有表级别的统计信息就足够了
                  直方图信息的出现不但不会对制定正确的执行计划有帮助,甚至会出现奇怪的现象导致执行计划不稳定
             ⑶ 列中数据均匀分布,比如身份证号,QQ号,主键等
             ⑷ 列中数据唯一且只使用相等作为判定条件
             ⑸ 对这个列所有的判定条件都使用了绑定变量
          
          
          ② 如何搜集histograms
          
          只有我们的DBA才最知道哪些列上应该收集直方图,这实际上已经远远不仅仅是技术问题了
          而是一个业务问题,因此DBA应该去熟悉业务,DBA应该知道自己的应用的数据分布特点,应该知道哪些列会常被用在where条件中
          
             
          Ⅰ analyze  
     
          
             histograms事实上它描述的就是数据在存储桶的分布范围!
             如何生成histograms?可以通过对表做分析!
             analyze table table_name compute statistics:不仅分析了表和索引,而且分析了表上的所有列,并生成了列的histograms
             analyze table table_name compute statistics for table:仅仅产生表的statistics,不生成列的histograms
             analyze table table_name compute statistics for all indexed columns:分析了表,并仅对表上的索引列产生histograms
             analyze table table_name compute statistics for all columns:分析表,同时生成所有列的histograms