There has been many discussion on the differences between analyze command and dbms_stats package on the internet.In this article ,my point is what should be done before gathering statistics. To prevent optimizer from choosing the bad plan after collecting the statistics,the original statistics should be saved!
step 1 : create a table to store the current statistics
exec dbms_stats.create_stat_table(ownname=>'scott',stattab=>'stat_table');
step 2 : gather the statistics and save the original statistics as follows:
begin
dbms_stats.gather_schema_stats(
ownname => 'test',
options => 'GATHER',--Gathers statistics on all objects in the schema
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'all indexed columns size auto',--default 'FOR ALL COLUMNS SIZE AUTO'
cascade => true, --this option is equivalent to running GATHER_INDEX_STATS procedure on each index
statown => 'scott',
stattab => 'stat_table'
);
end;
step 3 :
If the user believes that the new statistics are causing the optimizer to generate poor plans,
then the original statistics can be restored as follows:
begin
dbms_stats.delete_schema_stats(ownname => 'test');
dbms_stats.import_schema_stats(
ownname => 'test',
statown => 'scott',
stattab => 'stat_table'
);
end;
from:http://space.itpub.net/1698901/viewspace-218032
##########################################################
dbms_stats能良好地估量统计数据(尤其是针对较大的分区表),并能取得更好的统计后果,最终制订出速度更快的SQL施行计划。
exec dbms_stats.gather_schema_stats(
ownname => 'SCOTT',
options => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size repeat',
degree => 15
)
为了充沛认识dbms_stats的益处,需要仔细领会每一条次要的预编译指令(directive)。上面让咱们钻研每一条指令,并领会如何用它为基于代价的SQL优化器搜罗最高品质的统计数据。
options参数
使用4个预设的法子之一,这个选项能把握Oracle统计的刷新方法:
gather——重新剖析整个架构(Schema)。
gather empty——只剖析目前还没有统计的表。
gather stale——只重新剖析修改量超过10%的表(这些修改包含拔出、更新和删除)。
gather auto——重新剖析以后没有统计的对象,以及统计数据过期(变脏)的对象。注意,使用gather auto相似于组合使用gather stale和gather empty。
注意,不论gather stale仍是gather auto,都请求进行监视。假如你施行一个alter table xxx monitoring命令,Oracle会用dba_tab_modifications视图来跟踪发生发火变动的表。这样一来,你就确实地知道,自从上一次剖析统计数据以来,发生发火了多少次拔出、更新和删除操作。
estimate_percent选项
estimate_percent参数是一种比照新的设计,它答应Oracle的dbms_stats在搜罗统计数据时,自动估量要采样的一个segment的最佳百分比:
estimate_percent => dbms_stats.auto_sample_size
要考证自动统计采样的准确性,你可检视dba_tables sample_size列。一个有趣的地方是,在使用自动采样时,Oracle会为一个样本尺寸挑选5到20的百分比。记住,统计数据品质越好,CBO做出的抉择越好。
method_opt选项
method_opt:for table --只统计表
for all indexed columns --只统计有索引的表列
for all indexes --只剖析统计相干索引
for all columns
dbms_stats的method_opt参数尤其合适在表和索引数据发生发火变动时刷新统计数据。method_opt参数也合适用于判断哪些列需要直方图(histograms)。
某些情形下,索引内的各个值的散播会影响CBO是使用一个索引仍是施行一次全表扫描的决议计划。例如,假如在where子句中指定的值的数量不合错误称,全表扫描就显得比索引走访更经济。
假如你有一个高度歪斜的索引(某些值的行数不合错误称),就可创建Oracle直方图统计。但在现实世界中,出现这种情形的机率相称小。使用 CBO时,最罕见的过失之一就是在CBO统计中不用要地引入直方图。根据经验,只需在列值请求必需修改施行计划时,才应使用直方图。
为了智能地生成直方图,Oracle为dbms_stats准备了method_opt参数。在method_opt子句中,还有一些首要的新选项,包含skewonly,repeat和auto:
method_opt=>'for all columns size skewonly'
method_opt=>'for all columns size repeat'
method_opt=>'for all columns size auto'
skewonly选项会耗损大量处置时间,因为它要检查每个索引中的每个列的值的散播情形。
假如dbms_stat觉察一个索引的各个列散播得不均匀,就会为那个索引创建直方图,辅助基于代价的SQL优化器抉择是进行索引走访,仍是进行全表扫描走访。例如,在一个索引中,假设有一个列在50%的行中,如清单B所示,那么为了检索这些行,全表扫描的速度会快于索引扫描。
--*************************************************************
-- SKEWONLY option—Detailed analysis
--
-- Use this method for a first-time analysis for skewed indexes
-- This runs a long time because all indexes are examined
--*************************************************************
begin
dbms_stats.gather_schema_stats(
ownname => 'SCOTT',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size skewonly',
degree => 7
);
end;
重新剖析统计数据时,使用repeat选项,重新剖析义务所耗费的资源就会少一些。使用repeat选项(清单C)时,只会为现有的直方图重新剖析索引,不再搜寻其余直方图机会。活期重新剖析统计数据时,你应当采用这种方法。
--*************************************************************
-- REPEAT OPTION - Only reanalyze histograms for indexes
-- that have histograms
--
-- Following the initial analysis, the weekly analysis
-- job will use the “repeat” option. The repeat option
-- tells dbms_stats that no indexes have changed, and
-- it will only reanalyze histograms for
-- indexes that have histograms.
--**************************************************************
begin
dbms_stats.gather_schema_stats(
ownname => 'SCOTT',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size repeat',
degree => 7
);
end;
----------------------------------------------------------------------------------------------------------------------------
Exec dbms_stats.gather_schema_stats(ownname=>'用户名称',estimate_percent=>100,cascade=> TRUE, degree =>12);
含义解释 ownname:填写需要分析的用户(该用户下所有表都将被分析)
estimate_percent:分析抽样的力度
cascade:是否对索引进行分析
degree:并行处理的cpu数量
from:http://blog.csdn.net/cnham/archive/2010/07/02/5709232.aspx
分享到:
相关推荐
在使用 dbms_stats.gather_schema_stats 过程时,如果你想要知道自从上一次分析统计数据以来,发生了多少次插入、更新和删除操作,可以使用 alter table xxx monitoring 命令,Oracle 会用 dba_tab_modifications ...
该参数支持一个特殊值`DBMS_STATS.AUTO_SAMPLE_SIZE`,表示让Oracle自动计算最佳的采样比例。通过这种方式,Oracle会根据数据的特点自动选择合适的采样比例,通常在5%至20%之间。 要验证自动采样的效果,可以查询`...
18. **DBMS_STATS.GATHER_SCHEMA_STATS**: 收集整个模式的统计信息,优化性能。 19. **DBMS_PROFILER**: 性能分析工具,追踪PL/SQL代码的执行时间。 20. **DBMS_METADATA_DIFF**: 比较并显示两个数据库对象之间的...
- `dbms_stats.gather_schema_stats`: 收集模式下所有对象的统计信息。 - `dbms_stats.gather_index_stats`: 收集索引的统计信息。 - `dbms_stats.gather_system_stats`: 收集系统级别的统计信息。 - `dbms_...
人工进行统计可以使用以下命令:execute dbms_stats.gather_schema_stats(ownname =>'SCOTT', cascade=>true);对单个表执行统计分析:EXECUTE dbms_stats.gather_table_stats (ownname=>'SCOTT', tabname=>'EMP', ...
- 使用`DBMS_STATS.GATHER_INDEX_STATS`重新收集索引统计信息。 - **2.1.22 研究B-Tree索引结构的脚本** - B-Tree索引是Oracle中最常用的索引类型之一。 - 本书提供了一个脚本来展示B-Tree索引的内部结构。 - ...
##### 3.1 `dbms_stats.gather_schema_stats`过程详解 - **参数说明**: - `ownname`: 指定要收集统计信息的模式名。 - `options`: 控制统计信息收集的行为。有四个可选值: - `GATHER AUTO`: 自动决定是否收集...
`DBMS_STATS.gather_table_stats()`和`DBMS_STATS.gather_schema_stats()`过程可用于分析单个表或整个模式,参数如`degree`(并行度)、`estimate_percent`(采样比例)和`cascade`(级联收集)可根据实际情况调整。...
`来收集数据库级别的统计信息,或者使用`exec dbms_stats.gather_schema_stats('SCHEMA_NAME');`针对特定模式进行收集。 2. **比较快照**: 使用`ANALYZE SESSION`或`ANALYZE DATABASE`命令在不同时间点创建快照,...
- **收集快照**:使用 `DBMS_STATS.GATHER_DATABASE_STATS` 或 `DBMS_STATS.GATHER_SCHEMA_STATS` 函数进行快照采集。 - **分析报告**:通过 `DBMS_STATS.REPORT_STATISTICS` 或 `DBMS_STATS.REPORT_TABLE_STATS` ...
使用`DBMS_STATS.GATHER_SCHEMA_STATS`包可以对指定的模式(如'CITICTEST')进行统计信息收集。参数10可能代表了统计信息的细化程度,数值越大,收集的信息越详细。 2. **创建统计信息实体表**: `DBMS_STATS....
1. **收集统计信息**:使用`EXEC DBMS_STATS.GATHER_DATABASE_STATS`命令来收集整个数据库的统计信息,或者使用`EXEC DBMS_STATS.GATHER_SCHEMA_STATS`针对特定模式。 2. **创建快照**:通过`EXEC STATSPACK....
EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'SCOTT', tabname => 'EMP', method_opt => 'FOR ALL COLUMNS', estimate_percent => '100', degree => '8', granularity => 'ALL', cascade => TRUE); ``` ...
1. **生成快照**:这是Statspack的核心功能,通过`EXEC DBMS_STATS.GATHER_DATABASE_STATS()`或`EXEC DBMS_STATS.GATHER_SCHEMA_STATS()`等PL/SQL过程,可以定时或即时生成数据库或特定模式的统计快照,这些快照包含...
EXEC DBMS_STATS.GATHER_SCHEMA_STATS( OWNNAME => 'SCOTT', OPTIONS => 'GATHERAUTO', ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE, METHOD_OPT => 'FORALL COLUMNS SIZE REPEAT', DEGREE => 15 ) ``` ...
- **定期维护**:定期执行DBMS_STATS.GATHER_SCHEMA_STATS等维护任务,保持统计信息的准确性。 通过深入学习和实践这些知识点,你可以有效地优化Oracle SQL查询,提高数据库系统的运行效率,确保数据访问的快速和...
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('schema_name', cascade => TRUE); ``` - `ALTER SYSTEM FLUSH SHARED_POOL` 清空共享池以释放内存资源: ```sql ALTER SYSTEM FLUSH SHARED_POOL; ``` - `ALTER SYSTEM...
定期执行DBMS_STATS.GATHER_SCHEMA_STATS或DBMS_STATS.GATHER_DATABASE_STATS可以更新统计信息。 10. **监控和警报**:设置数据库警报和性能阈值,可以及时发现性能问题。DBA_OUTPUT视图可以查看警报日志,而DBA_...
`DBMS_STATS.GATHER_TABLE_STATS`用于收集表的统计信息,`DBMS_STATS.PUSH_SCHEMA_STATS`将统计信息推送到数据字典。 13. **DBMS_APPLICATION_INFO**: 在PL/SQL程序中设置和查询应用信息,如客户端信息和工作负载...
12. **更新统计信息**:定期执行DBMS_STATS.GATHER_TABLE_STATS或DBMS_STATS.GATHER_SCHEMA_STATS以保持统计信息的准确性,帮助Oracle优化器做出更好的执行计划。 13. **合理设置表空间和数据块大小**:根据数据...