11g上如何收集优化器(optimizer)统计信息

注:本文参见MOS(my oracle support)英文文档Document:749227.1 - How to Gather Optimizer Statistics on 11g

本文概述了在Oracle 11g中收集CBO(Cost Based Optimizer)统计信息的推荐方法。
 
   本文适用范围:
       
   Oracle Server – 企业版 – 版本 11.1.0.6
to 11.2.0.3
       
   Oracle Server – 标准版 –版本11.1.0.6 to 11.2.0.3
       
   Oracle Server – 个人版 –版本11.1.0.6 to 11.2.0.3
 
   文文信息适用于任何平台。

1、不同数据库版本的缺省设置:
   
不同版本收集统计信息时使用的缺省设置可能是不一样的,例如:
?
a、ESTIMATE_PERCENT的缺省值:
          9i :
100%
       
  10g :
DBMS_STATS.AUTO_SAMPLE_SIZE (使用非常小的估算百分比)
          11g :
DBMS_STATS.AUTO_SAMPLE_SIZE (使用更大的估算百分比 - 100%)
? b、METHOD_OPT:
defaults:
          9i :
"FOR ALL COLUMNS SIZE 1" ,等同于没有列值的具体分布信息。
          10g
and 11g : "FOR ALL COLUMNS SIZE AUTO" 。
       
   设置成AUTO意味着如果histogram的存在会有助于生成更准确的执行计划,DBMS_STATS会自动在需要字段上生成它。
    
 在11g中,AUTO_SAMPLE_SIZE的缺省值是100%,从而尽可能使统计信息是准确的。在之前的版本上,由于时间的制约,100%的sample
size有时候是不可能的,由于11g实施了一个新的hash算法避免了传统的排序(在9i和10g典型慢的部分是排序),这显著的减少了了收集的时间并提升了资源使用效率。同样,是否收集列上的统计信息也是自动决定的。

2、快速重建统计信息的推荐步骤
 
   为快速删除和重建某张表及它的索引的统计信息(包含非均匀分布列的统计信息),推荐如下操作:
     exec
dbms_stats.delete_table_stats(ownname=>‘user_name‘,
            
tabname=>‘table_name‘,cascade_indexes=>true);
     exec
dbms_stats.gather_table_stats(ownname=>‘user_name‘,
          
   tabname=>‘table_name‘,
          
   estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
          
   cascade=>true,
             
 method_opt=>‘for all columns size AUTO‘);
      注:从10gR2
开始,可用下边的方法来恢复统计信息,参见文档Document:452011.1
- * Restoring table statistics in
10G onwards

3、统计信息收集命令的几种情况
 
   a、收集单一表的统计信息
          exec
dbms_stats.gather_table_stats(
             
   ownname => ‘ Schema_name ‘,  
             
   tabname => ‘ Table_name ‘,
             
   estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
             
   cascade => TRUE, - method_opt => ‘FOR ALL COLUMNS SIZE AUTO‘
);
         
注1:如果确定histogram不会对产生更好的执行计划有帮助,那么更好的做法是将下边这一行:
       
   method_opt => ‘FOR ALL COLUMNS SIZE AUTO‘替换成method_opt => ‘FOR ALL
COLUMNS SIZE 1‘
         
注2:您需要将‘ Schema_name ‘和‘ Table_name ‘替换成真正需要收集的schema和table的名字。

b、收集某一schema下的所有对象的统计信息
          exec
dbms_stats.gather_schema_stats(  
                
 ownname => ‘ Schema_name ‘,  
                
 cascade => TRUE,
                
 method_opt => ‘FOR ALL COLUMNS SIZE AUTO‘ );
          注:将‘
Schema_name ‘替换成需要收集的schema的名字。

c、收集database中所有对象的统计信息:
           exec
dbms_stats.gather_database_stats(  
                
 cascade => TRUE,  
                
 method_opt => ‘FOR ALL COLUMNS SIZE AUTO‘ );

4、注意事项
 
   a、为了尽可能生成准确的统计信息,推荐使用的sample size(采样率)为100%。因为sample
size的减少可能会导致生成的统计信息不准确。一般来说使用100%的sample
size会使收集信息的时间增长,所以需要考虑调整当前使用的maintenance window,使统计信息的收集能在一个maintenance
window完成。
?
b、收集新的optimizer统计信息一般会保持或改进已存在的执行计划,但是也可能使某些查询的性能下降。所以从10gR1开始系统默认会保留最近30天的统计信息,这期间如果遇到问题可以用如下方法恢复到之前的统计信息:
         
Document:452011.1 - * Restoring table statistics in 10G onwards
?
c、收集新的optimizer的统计信息可能使shared
pool中的cursor无效,所以建议在数据库负载低的时候执行统计信息收集工作,比如在maintenance window期间执行。
? d、除了object
statistics(比如业务表和索引的统计信息)以外,推荐对dictionary objects(数据字典对象)也做统计信息收集:
       
 Document 457926.1 How to Gather Statistics on SYS Objects and ‘Fixed‘
Objects?
?
e、对非常大的系统,统计信息的收集会是非常消耗时间和资源的工作。在这种情况下需要小心选择sample
size的大小,确保在可接受的时间范围、资源限制和维护窗口内完成收集。详细建议参见以下文档:
       
 Document 44961.1 Statistics Gathering: Frequency and Strategy
Guidelines
 
   f、对于某些系统,推荐使用基于改变的统计信息的收集,避免重复收集不必要的信息。和10g相比,11g的自动统计信息的过程已经发生了改变,详见以下文档:
        Document
237901.1 Gathering Schema or Database Statistics Automatically -
Examples
        Document
756734.1 11g: Scheduler Maintenance Tasks or Autotasks
        Document
743507.1 Why Has the GATHER_STATS_JOB been removed in 11g

5、收集对象统计信息需考虑的因素
     Cost Based
Optimizer(CBO)是基于统计信息来生成特定查询的执行计划。当sample
size减小的时候,基于抽样出来的样本可能会生成不同的统计信息,这是因为这些样本有可能正好是用某些特定的方法录入的。
在11g中,推荐使用定期统计信息收集脚本收集统计信息。
 
   收集统计信息时考虑如下因素:
 
   a、使用足够大的sample size 在11g中,对于ESTIMATE_PERCENT,我们建议使用缺省的
DBMS_STATS.AUTO_SAMPLE_SIZE。Oracle首先会判断如果对一个表使用100%的sample size是否能在一个maintenance
window中收集完。如果能收集完那么就对这个表使用100%的sample size,这意味着对这张表收集统计信息的频率会降低。如果100%的sample
size并不可行,那么会至少使用30%作为sample size。11g使用了一种hash算法来计算统计信息,所以在大多数时候收集信息的性能都是可以接受的。
通常,对大部分应用程序而言,相对于数据每天发生的一点点变化,统计信息整体上的准确度更重要一些。
?
b、收集所有对象的统计信息
       
 确保所有对象(表和索引)都收集了统计信息。这个可以通过使用CASCADE参数来实现。
?
c、收集字段的统计信息/数据非均匀分布列的histogram
       
 确保所有数据非均匀分布的列都收集了histogram,并且使用METHOD_OPT参数来确保histogram的精度。通常推荐使用缺省的设置“AUTO”。这意味着如果histogram的存在会有助于生成更准确的执行计划,DBMS_STATS会自动在需要字段上生成它。相对于在所有的列上收集histogram,只在确实需要的列上收集是更稳妥的做法。
       
 在早期的版本中,参数METHOD_OPT的缺省的设定是"FOR ALL COLUMNS SIZE
1"。这意味着我们只会收集列的最大最小值,而没有值的具体分布的信息。有些时候histogram的存在反而不利于好的执行计划的产生,所以当从一个版本升级到另外一个版本后,用户可能希望先将这个参数设置为之前版本的值,运行一段时间后再调整为当前版本的值,确保升级后系统更加平稳,详见文档:Document
465787.1 How to: Manage CBO Statistics During an Upgrade from 10g or 9i into
11g
 
   d、收集分区对象的Global Statistics(全局统计信息)
       
 如果使用了partition(分区)技术,时间允许的话尽可能收集Global
Statistics。Global Statistics是非常重要的,但因为涉及数据量及收集时间长度的影响,很多时候它都被略过了。小的采样(例如0.001,
0.0001,
0.00001等)可以是非常有效的,但同时大量能帮助optimizer生成准确执行计划的数据会被忽略掉的。参数ESTIMATE_PERCENT有一个非常弹性的有效的范围,不同的系统需要经过测试才能得出最适合这个系统的值。详见以下文档:Document
236935.1 Global statistics - An Explanation
     e、收集System
Statistics(系统统计信息)
         
收集System
Statistics可以真实反映系统CPU负载情况。除了估算正常I/O部分的cost之外,这些信息会帮助CBO更好的估算CPU部分的cost。详细内容可参见文档:
       
 Document 470316.1 Using Actual System Statistics (Collected CPU and IO
information Document 149560.1 Collect and Display System Statistics (CPU and IO)
for CBO usage
        Document
153761.1 Scaling the System to Improve CBO optimizer
?
f、从早期版本升级到11g
    
   如果您是从Oracle的早期版本升级到11g,您可以参见以下关于统计信息管理的建议:
        Document
465787.1 How to: Manage CBO Statistics During an Upgrade from 10g or 9i into
11g

时间: 2024-10-23 21:36:31

11g上如何收集优化器(optimizer)统计信息的相关文章

各种优化器Optimizer的总结与比较

1.梯度下降法(Gradient Descent) 梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法: 标准梯度下降法(GD, Gradient Descent) 随机梯度下降法(SGD, Stochastic Gradient Descent) 批量梯度下降法(BGD, Batch Gradient Descent) class tf.train.GradientDescentOptimizer 使用梯度下降算法的Optimizer 标准梯度下降法(GD) 假设要学习训练的模型参数为

优化器Optimizer

目前最流行的5种优化器:Momentum(动量优化).NAG(Nesterov梯度加速).AdaGrad.RMSProp.Adam,所有的优化算法都是在原始梯度下降算法的基础上增加惯性和环境感知因素进行持续优化 Momentum优化 momentum优化的一个简单思想:考虑物体运动惯性,想象一个保龄球在光滑表面滚下一个平缓的坡度,最开始会很慢,但是会迅速地恢复动力,直到达到最终速度(假设又一定的摩擦力核空气阻力) momentum优化关注以前的梯度是多少,公式: \((1)m \leftarro

PLSQL_性能优化系列1_统计信息的概念和重要性(概念)

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

解决oracle 11g安装导致数据库无法自动搜集统计信息

近期发现个别11G数据库无法自动收集统计信息,部分视图查询结果如下: SQL>  select client_name,status from dba_autotask_client where client_name = 'auto optimizer stats collection'; CLIENT_NAME                                                      STATUS -------------------------------

13.4.3 收集有关地区的统计信息

我们的目标是展示自 1990 年以来,不同地区森林面积的变化.我们需要遍历所有已有的地区,检查数据是否可用,找到下载的指标值.这可以通过使用我们创建的映射,非常轻松地完成,因为已经用年份和地区 ID 作为键. 但是需要小心,因为有一些数据可能会缺失,因此,我们要过滤掉所有年份没有数据的地区.另外,我们还想要显示森林总面积,而不是百分比,因此,在返回数据之前,要进行简单的计算.虽然听起来可能很难,但是,代码并不非常复杂.清单 13.17 显示了最终我们要在 F# Interactive 中输入的几

【数据库】优化器(optimizer)

optimizer is the core of a DB engine! 实际运行计划(physical plan) = 访问方式 ( access method) + join算法 + 执行顺序 1.access method 1) index scan 2) file scan 2.join algorithm 1) nested-loop 2) hash 3) sort-merge 3.执行顺序 一个复杂query由一些简单的query(single block)嵌套而成, 如:sele

【Oracle 优化器】自适应执行计划(Adaptive Execution Plans)

概述 自适应连接方法AJM AJM例 AJM的处理流程 自适应并行分配方法APDM APDM例 APDM的处理流程 关于分配方法 总结 参考 概述 我们知道在12c之前的版本,虽然有ACS.CFB等功能通过在SQL文执行时收集信息,来改善SQL文再次执行时的执行计划,但是在SQL文第一次执行时,只能根据统计信息做成的执行计划执行SQL,在执行过程中并不能改变. 如果统计信息不准确,访问的数据行数非常大并且选择的执行计划不是最优时,在SQL文第一次执行时可能会引起在灾难性的性能问题. 自适应执行计

理解统计信息(4/6):自动更新统计信息的阀值——人为更新统计信息的重要性

在理解统计信息(3/6):谁创建和管理统计信息?在性能调优中,统计信息的作用里我们讨论了统计信息的自动创建和自动更新.我们真的需要人为维护统计信息来保持性能最优?答案是肯定的,这取决与你的工作量.SQL Server只在达到阀限值时进行统计信息的自动更新.当大量的Insert/Update/Delete操作发生时,内建的自动更新统计信息不能持续保证性能的最优. 经过一系列的Insert/Update/Delete后,统计信息可能不会是最新.如果SQL Server查询优化器在表里需要指定列的统计

SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016)

原文:SQL Server 中统计信息直方图中对于没有覆盖到谓词预估以及预估策略的变化(SQL2012-->SQL2014-->SQL2016) 本文出处:http://www.cnblogs.com/wy123/p/6770258.html 统计信息写过几篇了相关的文章了,感觉还是不过瘾,关于统计信息的问题,最近又踩坑了,该问题虽然不算很常见,但也比较有意思.相对SQL Server 2012,发现在新的SQL Server版本(2014,2016)中都有一些明显的变化,下文将对此进行粗浅的