【sql调优】动态采样

1. Dynamic Sampling (动态采样)
    The purpose of dynamic sampling is to improve server performance by determining more accurate selectivity and cardinality estimates.
    More accurate selectivity and cardinality estimates allow the optimizer to produce better performing plans.
    (动态采样的目的是为了通过更精确的seletivity值cardinality值来提高服务器性能,更精确的seletivity值cardinality值可以让优化器提供更好的执行计划。)
    Estimate single-table predicate selectivities when collected statistics cannot be used or are likely to lead to significant errors in estimation.
    Estimate table cardinality for tables without statistics or for tables whose statistics are too out of date to trust.
    (当没有使用statistics统计信息或者可能导致评估错误的时候,可以提前预估出来单表的selectivities值。
      当表没有收集统计信息时,或者表的统计信息过期的时候,可以估算出表的cardinality值。)
  
2. How Dynamic Sampling Works(动态采样如何工作)
   The primary performance attribute is compile time.
   Oracle determines at compile time whether a query would benefit from dynamic sampling.
   If so, a recursive SQL statement is issued to scan a small random sample of the table's blocks,
   and to apply the relevant single table predicates to estimate predicate selectivities.
   The sample cardinality can also be used, in some cases, to estimate table cardinality.
   (主要的性能影响被归因于编译时间。ORACLE来判断在编译的时候,动态采样是否对查询是否有意。如果是,那么sql语句会发起
   相对应表的快的小部分随机采样,然后应用相关的单表去前瞻性预估相应的selectivities值。
3. When to Use Dynamic Sampling(什么时候使用动态采样)
   (1) A better plan can be found using dynamic sampling.
       使用动态采样可以更好的生成执行计划
   (2) The sampling time is a small fraction of total execution time for the query.
       动态采样的时间占查询执行的时间一小部分
   (3) The query will be executed many times.
       查询语句将被执行许多次
 
4. How to Use Dynamic Sampling to Improve Performance
   (如何使用动态采样提高性能)
 
   Level 0: dynamic sampling will not be done.
            (动态采样不会收集)
 
   Level 1: (default value) dynamic sampling will be performed if all of the following conditions are true:
             默认值,如果如下的条件全部满足的时候,那么动态采样将被执行
           (1) There is more than one table in the query.
             有超过一个表的查询
           (2) Some table has not been analyzed and has no indexes.
             一些表没有被分析,而且没有index
           (3) The optimizer determines that a relatively expensive table scan would be required for this unanalyzed table.        优化器认为这个没有被分析的表会消耗相当昂贵的表扫描资源)
             
   Level 2: Apply dynamic sampling to all unanalyzed tables.
            The number of blocks sampled is the default number of dynamic sampling blocks.
            (针对所有没有被分析的表应用动态采样,采样blocks的数量是默认的动态采样的数量)
 
   Level 3: Apply dynamic sampling to all tables that meet Level 2 criteria, plus all tables for which standard selectivity estimation used a guess for some predicate
            that is a potential dynamic sampling predicate.
            The number of blocks sampled is the default number of dynamic sampling blocks.
            (根据level2的标准,应用动态采样到所有的表,以及为一些标准selectivity值的表使用一些采样预测,采样blocks的数量是默认的动态采样的数量)
          
   Level 4: Apply dynamic sampling to all tables that meet Level 3 criteria, plus all tables that have single-table predicates that reference 2 or more columns.
            The number of blocks sampled is the default number of dynamic sampling blocks.
            (根据level3的标准,应用动态采样到所有的表,以及一些大于2列的单表的预测。采样blocks的数量是默认的动态采样的数量)
          
   Level 5: Apply dynamic sampling to all tables that meet the Level 4 criteria using 2 times the default number of dynamic sampling blocks.
           (根据level4的标准,应用动态采样到所有的表,并且采样blocks的数量是默认的动态采样的数量的2倍)          
 
   Level 6: Apply dynamic sampling to all tables that meet the Level 5 criteria using 4 times the default number of dynamic sampling blocks.
           (根据level5的标准,应用动态采样到所有的表,并且采样blocks的数量是默认的动态采样的数量的4倍)
 
   Level 7: Apply dynamic sampling to all tables that meet the Level 6 criteria using 8 times the default number of dynamic sampling blocks.
            (根据level6的标准,应用动态采样到所有的表,并且采样blocks的数量是默认的动态采样的数量的8倍)
 
   Level 8: Apply dynamic sampling to all tables that meet the Level 7 criteria using 32 times the default number of dynamic sampling blocks.
            (根据level7的标准,应用动态采样到所有的表,并且采样blocks的数量是默认的动态采样的数量的32倍)
 
   Level 9: Apply dynamic sampling to all tables that meet the Level 8 criteria using 128 times the default number of dynamic sampling blocks.
            (根据level8的标准,应用动态采样到所有的表,并且采样blocks的数量是默认的动态采样的数量的128倍)

   Level 10: Apply dynamic sampling to all tables that meet the Level 9 criteria using all blocks in the table.
            (根据level9的标准,应用动态采样到所有的表,并且采样表中所有的blocks)
 
 
   Increasing the value of the parameter results in more aggressive application of dynamic sampling, in terms of both the type of tables sampled (analyzed or unanalyzed) and the amount of I/O spent on sampling.
   Dynamic sampling is repeatable if no rows have been inserted, deleted, or updated in the table being sampled.
   (增加这个参数的值,从表的采样和I/O消耗的角度来说,动态采样将导致更多资源的征用。
     在被采样的表中,即使没有记录被insert, deleted, update,采样的操作仍会被重复。)
  来自:http://space.itpub.net/9252210/viewspace-608724

时间: 2024-12-09 12:23:12

【sql调优】动态采样的相关文章

SQL 调优1

                                             SQL 调优1 调整的方法调整的工具内存组件调整  shared_pool data_buffer pga IO性能文件确定 调整的方法:调整的流程 架构设计 建模 程序 数据库 硬件调整  每次只调整一个地方 top     消耗资源最多 执行的次数最多 执行的时间最长     达到优化的目标就不优化了     优化的过程中一定不要产生新的性能问题 ----->熟悉别人的生产环境 调整的工具:1   v$

sql 调优 oracle 执行速度再快一点

问题描述 sql 调优 oracle 执行速度再快一点 select psf.pol_num, psf.bank_acct_num, cba_dda.bank_acct_nm from tbank_pos_slip_files psf, tclient_policy_links cpl_dda, tclient_bank_accounts cba_dda where cpl_dda.cli_num = cba_dda.cli_num and cpl_dda.bank_acct_typ = cba

ORACLE SQL调优之'PLAN_TABLE' is old version

  在为国投做SQL调优时,他们开发说不要动现在的SQL,调整一下执行计划即可,即查询某个表时执行特定的执行计划.乍一听,我是吓了一跳!  由于他们开发不让动SQL结构(该SQL经过PLSQL优化后有500多行,其是2层嵌套递归查询,外边一个SQL如图1-2,外层SQL的每一个列是一个子查询如下图1-1,递归子查询有32个),所以只能从SQL涉及的表.索引下手,查找问题的具体原因及解决办法.我的做法是,先查看了SQL涉及的表的统计信息,问题SQL涉及了8张表(最大的表有300M左右,小表只有几M

使用sqld360进行特定SQL调优分析

    系统性能问题通常是一个综合性的问题,用户对系统的反馈,通常是一个"慢"字.对调优人员,要从网络.应用服务器.数据库服务器等多个层面进行定位,发现瓶颈.如果落实到数据库层面,执行SQL速度慢就是开发运维DBA所需要关注的范畴. 对系统SQL的调优,一般而言不是"一锤子"买卖.而且,性能问题SQL也都遵循"二八原则",即百分之八十的性能问题,是由百分之二十的SQL语句引起的.所以,每次集中处理两到三个SQL,之后看效果再决定下一步处理的方式,

一次SQL调优数据库性能问题后的过程(300W)_MsSql

将绝大部分的SQL查询改为存储过程,这样的操作毫无疑问可以提高部分性能. 凡是使用"select * from xxx"的操作一律具体到所需字段. 使用join连接2个以上大量数据的表,且基础数据表变化不大的查询一律使用视图,并为此视图建立索引.理由来自SQL Server联机帮助手册: "对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图.如果在查询中频繁地引用这类视图,可通过对视图创建

一次SQL调优数据库性能问题后的过程(300W)

将绝大部分的SQL查询改为存储过程,这样的操作毫无疑问可以提高部分性能. 凡是使用"select * from xxx"的操作一律具体到所需字段. 使用join连接2个以上大量数据的表,且基础数据表变化不大的查询一律使用视图,并为此视图建立索引.理由来自SQL Server联机帮助手册: "对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图.如果在查询中频繁地引用这类视图,可通过对视图创建

生产系统pl/sql调优案例

昨天基本休息了一天,想着生产系统升级也会多多少少碰到些问题,肯定有一些心得或者是值得学习的东西,结果昨晚到现在生产系统升级一直为一个pl/sql的问题所困扰.在测试环境中只用了十多分钟, 在生产系统上跑了快5个小时.这个经历太痛苦了,大半夜还在考虑怎么优化真是痛苦. 这个也算是一个很深刻的学习经验,和大家分享一下. pl/sql的大体功能是从用户订购的套餐根据指定的参数来取得所对应的产品编号,然后在订购表中去查询,生成动态的sql语句.看起来功能也不复杂.代码如下:首先按照要求清除指定的数据,然

SQL调优之列值的集簇因子研究

列值的选择性.集簇和柱状图 切记,优化器了解表中列数据的许多重要特征,最显著的是列值的选择性和列的集簇因子. 例如,以下我们看到一个使用列值来形成结果集的查询: select   customer_name from   customer where   customer_state = 'Rhode Island'; 在此示例中,选择使用索引还是全表扫描受到罗得岛客户比例的影响.如果罗得岛客户的比例非常小 ,并且数值集簇在数据块中,则对于此查询而言索引扫描可能是最快的执行计划. 许多 Orac

【sql调优】绑定变量与CBO

SQL> var x1 number; SQL> exec :x1 :=1; PL/SQL 过程已成功完成. SQL> set autot on SQL> set autot traceonly SQL> select count(*) from t where object_id =:x1 or :x1=0; 执行计划 ---------------------------------------------------------- Plan hash value: 29