热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微课sql优化(5)、统计信息收集(3)-关于默认采样率

1、关于默认采样率在不同版本的Oracle上统计信息收集的默认值不一定相同,例如:ESTIMATE_PERCENT:默认值: 9i:100%10g:DB

1、关于默认采样率


在不同版本的Oracle上统计信息收集的默认值不一定相同,例如:
ESTIMATE_PERCENT :默认值:
 9i:100%
10g:DBMS_STATS.AUTO_SAMPLE_SIZE(使用非常小的估计百分比)
11g:DBMS_STATS.AUTO_SAMPLE_SIZE(使用较大的估算百分比 - 100%)
METHOD_OPT:默认值
9i:“FOR ALL COLUMNS SIZE 1”,实际上没有详细的列统计。
10g和11g:“FOR ALL COLUMNS SIZE AUTO” - 此设置意味着DBMS_STATS决定哪些列添加直方图,制定更好的计划。 
在11g中,使用ESTIMATE_PERCENT的默认值100%,统计信息收集尽可能准确。收集统计信息时间限制,在以前的版本中,100%的样本是不可能的,但是11g实现了一种新的哈希算法来计算统计数据而不是排序(在9i和10g中,“慢”部分通常是排序),这显着提高了收集时间和资源使用。

2、统计信息收集了什么,有什么作用

  • table statistics
微课sql优化(5)、统计信息收集(3)-关于默认采样率
NUM_ROWS:  NUM_ROWS是计算cardinality的基础,如果该表是嵌套循环联接(nested loops join)的驱动表,表的行数就特别重要,驱动表的行数,决定了被驱动表的扫描次数。
BLOCKS : 表使用的块数,该参数和DB_FILE_MULTIBLOCK_READ_COUNT一块使用,可以计算 全表扫描所需要的IO数量。
AVG_ROW_LEN :   表中记录的平均大小bytes
EMPTY_BLOCKS :   未使用的空数据块数据量,已使用的数据块与高水位之间的数据块数量。(ANALYZE)
AVG_SPACE :   平均空闲空间bytes(ANALYZE)
CHAIN_CNT :      行迁移或行链接
  • index statistics

微课sql优化(5)、统计信息收集(3)-关于默认采样率

如果需要使用索引,CBO 需要索引的前导列在查询条件中使用,如果没有查询条件或索引列包含所有查询结果,CBO更倾向使用全索引扫描或全表扫描。
BLEVEL: 从根结点到叶子结点的高度,用来计算叶子结点查找的成本。0表明根块和叶块是一样的。 
LEAF_BLOCKS:  用于计算 full index scane及index range scan的成本 。
CLUSTERING_FACTOR :  基于索引的值计算表中记录的顺序程度。如果该值接近块的数量,表中记录有序存储。在这种情况下,索引条目在单个叶块往往指向相同的数据块中的行。如果该值接近表的行数,表示记录无序存储。在这种情况下,不太可能在同一叶块索引条目指向相同的数据块中的行。
DISTINCT_KEYS  :  不同的索引值数量。在主键约束和唯一索引中,该值等于表记录数。
AVG_LEAF_BLOCKS_PER_KEY :   叶块的平均数量在每一个不同的值出现在索引中,四舍五入为最接近的整数。实施独特的索引和主键约束,这个值总是1(一个)。索引值在不同叶子结点出现的平均数量,在唯一索引和主键约束中,该值为总是这1。
AVG_DATA_BLOCKS_PER_KEY  :   表中数据块指向同一索引值的平均数量。
NUM_ROWS  :   索引中的行数
  • column statistics

微课sql优化(5)、统计信息收集(3)-关于默认采样率

NUM_DISTINCT : 计算选择性。(例: 1/NDV) 
LOW_VALUE and HIGH_VALUE: 对所有数据类型,CBO假设在高值和低值之间是均匀分布的。这些值用于计算范围扫描的选择性。 
NUM_NULLS:  对存在空值的列,使用is null 和is not null查询时,计算选择性 
DENSITY:   
未收集直方图
 Density = 1 / Number of distinct NON null values
The number of distinct NON-null values for a column (COL1) on table TABLE1 can be obtained as follows:
select distinct count(COL1)  from   TABLE1 where  COL1 is not null;
收集直方图
A non-popular value is one that does not span multiple bucket end points.
A popular value is one that spans multiple end points.
For non-popular values the density is calculated as the number of non-popular 
values divided by the total number of values. Formula:
    Density =  Number of non-popular values
               ----------------------------
                  total number of values
We only use the density statistic for non-popular values. 
Popular values calculate the selectivity of a particular column values by 
using histograms as follows:
The Selectivity for popular values is calculated as the number of end points 
spanned by that value divided by the total number of end points. Formula:
    Selectivity = Number of end points spanned by this value
                  ------------------------------------------
                         total number of end points

3、练习3:10g和11g自动采样率测试


exec DBMS_STATS.DELETE_TABLE_STATS('HT','A_AMT');
exec dbms_stats.gather_table_stats('HT','A_AMT');
set line 200
col owner for a10
col table_name for a20 
col LAST_ANALYZED for a30
SELECT owner,
table_name,
num_rows,
sample_size,
trunc(sample_size / num_rows * 100) estimate_percent,
to_char(LAST_ANALYZED,'yyyy-mm-dd hh34:mi:ss') LAST_ANALYZED
FROM DBA_TAB_STATISTICS
WHERE owner='HT' and table_name='A_AMT';
oracle 10g测试结果
SQL> exec dbms_stats.gather_table_stats('HT','A_AMT');
PL/SQL procedure successfully completed.
SQL> set line 200
SQL> col owner for a10
col table_name for a20 
col LAST_ANALYZED for a30
SELECT owner,
table_name,
num_rows,
sample_size,
trunc(sample_size / num_rows * 100) estimate_percent,
to_char(LAST_ANALYZED,'yyyy-mm-dd hh34:mi:ss') LAST_ANALYZED
FROM DBA_TAB_STATISTICS
WHERE owner='HT' and table_name='A_AMT';SQL> SQL> SQL>   2    3    4    5    6    7    8  
OWNER       TABLE_NAME      NUM_ROWS SAMPLE_SIZE ESTIMATE_PERCENT LAST_ANALYZED
---------- -------------------- ---------- ----------- ---------------- ------------------------------
HT                   A_AMT         59968         59968        100                 2017-09-22 02:07:47
SQL> !date
Fri Sep 22 02:08:00 CST 2017
SQL> select version from v$instance;
VERSION
---------------------------------------------------
10.2.0.5.0
SQL> 
oracle 11g测试结果
OWNER       TABLE_NAME      NUM_ROWS SAMPLE_SIZE ESTIMATE_PERCENT
---------- -------------------- ---------- ----------- ----------------
HT            A_AMT      59968  59968        100

4、小结


1、 Oracle 10g可能 使用非常小的估计百分比,建议手工100%收集,至少30%。
2、 在11g中,使用ESTIMATE_PERCENT的默认值100%,统计信息收集尽可能准确。-- 11g:DBMS_STATS.AUTO_SAMPLE_SIZE(使用较大的估算百分比 - 100%)
3、直方图收集: METHOD_OPT:默认值 10g和11g:“FOR ALL COLUMNS SIZE AUTO” - 此设置意味着DBMS_STATS决定哪些列添加直方图,制定更好的计划。
4、了解 统计信息收集: table statistics index statistics column statistics,各指标内容及作用

推荐阅读
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
苏小明2602896955
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有