基于成本的优化器(前10g)收集统计
适用于:
Oracle服务器-企业版-版本:8.0.3.0到9.2.0.8-版本:8.0.3至9.2
目的:
统计信息收集成本的优化器为数据库管理员提供可用的方法
问答:
收集统计信息
看到更高版本的建议:
注:1226841.1如何:基于成本的优化器收集统计
基于成本的优化方法是用统计信息来估计每个执行计划的成本。你应该随着时间的推移定期收集统计信息,从而适应陈旧的对象数据卷或列值的变化。
有关收集新的统计信息,请参阅
注:44961.1收集统计数据的频率和战略方针
有2种方式收集模式对象的统计信息:
1. 使用DBMS_STATS(Oracle 8.1.5和更高版本)
1.1 GATHER_DATABASE_STATS数据库中的所有对象的统计
1.2 GATHER_SCHEMA_STATS架构中的所有对象的统计
1.3 GATHER_TABLE_STATS表,列和索引的统计信息
1.4 GATHER_INDEX_STATS指数统计
2. 分析或PL/SQL包递归ANANYZE语句(旧时尚)
2.1 ANALYZE命令
2.2 DBMS_UTILITY
2.3 DBMS_DDL
DBMS_STATS有新的改进,但没有分析。
****************************************
1.DBMS_STATS包(8.1.5和更高版本)
****************************************
- Oracle公司强烈建议您使用DBMS_STATS包而不是分析收集优化统计。
- DBMS_STATS包收集统计指标,表,列,分区,以及架构中的所有模式对象的统计资料或数据库。
- 不收集群集统计,但可以使用DBMS_STATS来收集统计数据而不是整个集群上的单个表。
- 统计数据收集操作,可以运行串行或并行。尽可能使用DBMS_STATS调用并行查询来收集统计信息指定的并行度;否则,它调用串行查询或ANALYZE语句。
o例如,8.1.x使用DBMS_STATS使用递归分析,收集统计
- 所有索引统计
- 所有的直方图
o例如,至9.2.x使用DBMS_STATS使用递归分析,收集统计
*簇索引
*域索引
*连接索引
- 默认情况下使用DBMS_STATS将生成的表的统计,而不是它的索引(默认为CASCADE=>假)。
- 全球统计 注:236935.1
o用于分区表和索引,可以收集单独使用DBMS_STATS每个分区的统计信息以及整个全球的统计表或索引。
o同样的,复合分区使用DBMS_STATS可以收集单独子分区,分区和整个表或索引的统计资料。
o根据被优化的SQL语句,优化器可能选择使用分区(或子分区)统计或全球统计数字。除非在查询谓词缩小查询到一个单一的分区,优化器使用的全球统计数据。因为大多数查询可能不会是这样的限制,最重要的是要有准确的全球统计。
o因此,实际上强烈建议使用DBMS_STATS包收集的全球统计数据,而不是计算它们与分析语句。
- 它可以收集统计监测时,只对“过时”的对象启用。见:注:102334.1
- 在9i以上,它可以做
o自动确定适当的样本大小估计的统计;
o只有在柱创造直方图他们是有用的。
1.1 DBMS_STATS.GATHER_DATABASE_STATS
====================================
可以收集所有的表和索引数据库中的统计。
一些参数-GATHER_DATABASE_STATS过程:
- estimate_percent
o空意味着计算
o有效范围是[0.000001,100]。
o DBMS_STATS.AUTO_SAMPLE_SIZE因此Oracle决定了良好的统计样本大小(推荐值9i及以上)。
- block_sample
o 只有相关时,做一个估计数字。
o 使用或不随机块抽样,而不是随机行抽样。
o随机块抽样更有效率,但如果数据不是随机分布在磁盘上,可能会有些相关的样本值。
- method_opt
oDEFAULT(10g之前的‘所有列的大小为1’,10g开始的‘所有列大小自动’)
o FOR ALL[索引|隐藏][size_clause]列
. INDEXED可以被用来当谓词列索引;
. HIDDEN基于函数的索引中的列;
. ALL当列出现在谓词里;
o FOR COLUMNS[长度子句]列|属性[长度子句][,列|属性[长度子句]…];
o size_clause:=尺寸{ integer | REPEAT | AUTO | SKEWONLY }
. integer 直方图桶数目。有效范围[1,254];
. REPEAT 仅收集已经有直方图(9i以上)列的直方图;
. AUTO Oracle决定收集数据分布和列(9i以上)的工作量的基础上的列的直方图;
. SKEWONLY Oracle决定在列的数据(9i以上)分布的基础上收集直方图。
o 注:252361.1使用DBMS_STATS总是设置AVG_ROW_LEN=100或留下的旧值;
- degree
o 并行度;
o NULL表示使用表的默认值;
o DBMS_STATS.DEFAULT_DEGREE指基于初始化参数(9i以上)的价值;
- granularity
o Only:如果表中的相关分区;
o DEFAULT:收集全球和分区级的统计;
o GLOBAL:收集全球统计;
o PARTITION:收集分区级的统计;
o SUBPARTITION:收集子分区级的统计;
o ALL:收集所有(子分区,分区和全球)的统计;
o Analyze:表不更换统计;
o Global:统计数据-使用DBMS_STATS与分析
- cascade
o Default(CASCADE=>FALSE).无收集索引;
o 集上的统计指标(真);
o 索引统计信息的收集不是并行化到9iR2之前;
o 等效gather_index_stats程序相当于每个指标在数据库中除了收集表和列的统计数字;
o 注:159374.1 DBMS_STATS.GATHER_SCHEMA_STATS不分析指标;
- options
o GATHER:默认.集的所有对象的统计信息;
o GRTHER AUTO:自动收集所有必要的统计。Oracle含蓄地确定哪些对象需要新的统计数据,并确定如何收集这些统计数据(9i以上);
o GATHER STALE:集所确定的陈旧的对象统计寻找* _tab_modifications意见;
o GATHER EMPTY:集目前没有统计对象的统计信息;
o 注:102334.1 如何自动更改基于统计信息收集-监测表;
o 注:228186.1 GATHER STALE和GATHER AUTO间的区别;
- gather_sys
o 集“SYS”用户(TRUE)所拥有的对象的统计;
1.2 DMBS_STATS.GATHER SCHEMA_STATS
==================================
可以收集所有架构中的表和索引的统计数据;
聚集SCHEMA_STATS程序-某些参数-:
o ownname=>架构分析(NULL表示当前模式);
o 请见GATHER_DATABASE_STATS除了GATHER_SYS;
1.3 DBMS_STATS.GATHER_TABLE_STATS
==================================
可收集表及其索引的统计信息。
-一些参数-GATHER_TABLE-STATS过程:
o ownname=>架构分析(NULL表示当前模式);
o tabname=>表名称;
o partname=>分区的名称;
o 请见DBMS_STATS.GATHER SCHEMA_STATS;
1.4 DBMS_STATS.GATHER_INDEX_STATS
==================================
可以聚集索引的统计信息。
-一些参数-GATHER_INDEX_STATS过程:
o ownname=>架构分析(NULL表示当前模式);
o indname=>索引的名称;
o partname=>分区的名称;
o 请见DBMS_STATS.GATHER SCHEMA_STATS;
注:237293.1如何从分析使用DBMS_STATS-
***********
2. ANALYZE
***********
===================
2.1 ANALYZE 命令
===================
- 旧时尚;
- Oracle公司强烈建议您使用DBMS_STATS包而不是分析收集优化统计。
- ANALYZE命令收集统计数据以串行方式。
- 它可以用来估计或计算统计。
- 如果指定没有样本大小分析表估计的统计,Oracle将只收集基于1064行的统计数据。使用ANALYZE命令时,你应该总是指定一个样本的大小,使默认情况下不会发生。(即分析表测试估计统计样本量的20%;)。
- 计算统计选项将保证,优化最好的统计资料显示,以确定一个给定查询的执行路径。(即分析表测试计算统计;)。
- 分析只收集分区级别统计,并派生出整个聚合表级别的统计信息。
- 默认情况分析表命令将生成的表的统计和所有的索引,不使用FOR子句。
========================
2.2 DBMS_UTILITY包
========================
DBMS_UTILITY包提供2程序,以协助收集统计数字。它生成分析针对不同对象的命令。
2.2.1. ANALYZE_SCHEMA
=====================
集架构中的所有表,簇和索引的统计信息。
ANALYZE_SCHEMA程序接受5个参数:
- schema=>模式来进行分析;
- method=>估计,计算或删除。如果估计,然后.estimate_rows或.estimate_percent必须是非零。
- estimate_rows=>估计的行数。
- estimate_percent=>行估计的百分比。如果estimate_rows指定,那么这个参数将被忽略。
- method_opt=>[FOR TABLE][FOR ALL[INDEXED]COLUMNS][SIZE n][FOR ALL INDEXES]
欲了解更多信息的ANALYZE_SCHEMA过程 注意:67615.1
欲了解更多信息的ANALYZE_SCHEMA过程 注意:1011835.102
2.2.2. ANALYZE_DATABASE
=======================
集上的所有表,集群和数据库中的索引的统计信息。
YZE_DATABASE程序接受4个参数:
- method=>估计,计算或删除。如果估计,然后.estimate_rows或.estimate_percent必须是非零。
- estimate_rows=>估计的行数。
- estimate_percent=>行估计的百分比。如果estimate_rows指定,那么这个参数将被忽略。
- method_opt=>[FOR TABLE][FOR ALL[INDEXED]COLUMNS][SIZE n][FOR ALL INDEXES]。
欲了解更多信息的ANALYZE_SCHEMA过程 注意:67616.1
====================
2.3 DBMS_DDL Package
====================
DBMS_DDL包提供了一个程序集也统计:
2.3.1 ANALYZE_OBJECT
====================
相当于SQL:
"ANALYZE
TABLE|CLUSTER|INDEX [.]
[] STATISTICS
[SAMPLE [ROWS|PERCENT]]"
欲了解更多信息的ANALYZE_SCHEMA过程 注意:77283.1
相关文件
-----------------
Oracle 8i/9.2的SQL参考手册
Oracle 8i/9.2的设计和优化性能第2版(8.1.6)第8章/第3章
Oracle 8i/9.2提供的软件包参考,第2卷发行8.1.5第49章/第63章