`

dbms_stats.gather_table_stats与analyze table 的区别

 
阅读更多

参考 http://www.itpub.net/viewthread.php?tid=845777&extra=&page=1
Analyze Statement
The ANALYZE statement can be used to gather statistics for a specific table, index or cluster. The statistics can be computed exactly, or estimated based on a specific number of rows, or a percentage of rows:

ANALYZE TABLE employees COMPUTE STATISTICS;
ANALYZE INDEX employees_pk COMPUTE STATISTICS;

ANALYZE TABLE employees ESTIMATE STATISTICS SAMPLE 100 ROWS;
ANALYZE TABLE employees ESTIMATE STATISTICS SAMPLE 15 PERCENT;
DBMS_UTILITY
The DBMS_UTILITY package can be used to gather statistics for a whole schema or database. Both methods follow the same format as the analyze statement:

EXEC DBMS_UTILITY.analyze_schema('SCOTT','COMPUTE');
EXEC DBMS_UTILITY.analyze_schema('SCOTT','ESTIMATE', estimate_rows => 100);
EXEC DBMS_UTILITY.analyze_schema('SCOTT','ESTIMATE', estimate_percent => 15);

EXEC DBMS_UTILITY.analyze_database('COMPUTE');
EXEC DBMS_UTILITY.analyze_database('ESTIMATE', estimate_rows => 100);
EXEC DBMS_UTILITY.analyze_database('ESTIMATE', estimate_percent => 15);
DBMS_STATS
The DBMS_STATS package was introduced in Oracle 8i and is Oracles preferred method of gathering object statistics. Oracle list a number of benefits to using it including parallel execution, long term storage of statistics and transfer of statistics between servers. Once again, it follows a similar format to the other methods:

EXEC DBMS_STATS.gather_database_stats;
EXEC DBMS_STATS.gather_database_stats(estimate_percent => 15);

EXEC DBMS_STATS.gather_schema_stats('SCOTT');
EXEC DBMS_STATS.gather_schema_stats('SCOTT', estimate_percent => 15);

EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES');
EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES', estimate_percent => 15);

EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK');
EXEC DBMS_STATS.gather_index_stats('SCOTT', 'EMPLOYEES_PK', estimate_percent => 15);
This package also gives you the ability to delete statistics:

EXEC DBMS_STATS.delete_database_stats;
EXEC DBMS_STATS.delete_schema_stats('SCOTT');
EXEC DBMS_STATS.delete_table_stats('SCOTT', 'EMPLOYEES');
EXEC DBMS_STATS.delete_index_stats('SCOTT', 'EMPLOYEES_PK');

--------------------------------------------------------------------------------------

自从Oracle8.1.5引入dbms_stats包,Experts们便推荐使用dbms_stats取代analyze。 理由如下

dbms_stats可以并行分析
dbms_stats有自动分析的功能(alter table monitor )
analyze 分析统计信息的不准确some times


1,2好理解,且第2点实际上在VLDB中是最吸引人的;3以前比较模糊,看了metalink236935.1 解释,analyze在分析Partition表的时候,有时候会计算出不准确的Global statistics .

原因是,dbms_stats会实在的去分析表全局统计信息(当指定参数);而analyze是将表分区(局部)的statistics 汇总计算成表全局statistics ,可能导致误差。

如果想分析整个用户或数据库,还可以采用工具包,可以并行分析
Dbms_utility(8i以前的工具包)
Dbms_stats(8i以后提供的工具包)

dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);

这是对命令与工具包的一些总结

1、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
a) 可以并行进行,对多个用户,多个Table
b) 可以得到整个分区表的数据和单个分区的数据。
c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
d) 可以倒出统计信息
e) 可以用户自动收集统计信息

2、DBMS_STATS的缺点
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。
c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True

3、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。

-----------------------------------------------------------------
10G的文档是这么说的:
Do not use the COMPUTE and ESTIMATE clauses of ANALYZE to collect optimizer statistics. These clauses are supported for backward compatibility. Instead, use the DBMS_STATS package, which lets you collect statistics in parallel, collect global statistics for partitioned objects, and fine tune your statistics collection in other ways. The cost-based optimizer, which depends upon statistics, will eventually use only statistics that have been collected by DBMS_STATS

analyze的功能已经明确:
Use the ANALYZE statement (rather than DBMS_STATS) forstatistics collection not related to the cost-based optimizer:

To use the VALIDATE or LIST CHAINED ROWS clauses

To collect information on freelist blocks

在收集与CBO优化器不相关的统计信息的时候ANALYZE语句要优于DBMS_STATS包

-----------------------------------
EX:
begin
for owner in (select username from dba_users where username not in ('SYS','SYSTEM'))
loop
dbms_output.disable;
dbms_output.enable(1000000);
dbms_output.put_line('Schema: '||owner.username);
select sysdate into start_time from dual;
dbms_output.put_line('Analyze start from : '||start_time);
dbms_stats.gather_schema_stats(ownname => owner.username, estimate_percent => 20, block_sample=> true, cascade=>true);
select sysdate into end_time from dual;
dbms_output.put_line('Analyze complete at : '||end_time);
dbms_output.put_line('---------------------------');
end loop;


dbms_stats.gather_table_stats(ownname =>,
tabname =>,
partname =>,
estimate_percent =>,
block_sample =>,
method_opt =>,
degree =>,parallel degree(并行收集维度) 看CPU个数
granularity =>,
cascade =>,true is also gather columns and index’s statistics;
no_invalidate =>);

from:http://jackjw.itpub.net/post/602/480472

分享到:
评论

相关推荐

    DBMS_STATS.GATHER_TABLE_STATS详解.pdf

    ### DBMS_STATS.GATHER_TABLE_STATS详解 #### 一、概述 `DBMS_STATS.GATHER_TABLE_STATS` 是 Oracle 数据库中的一个重要过程,主要用于收集表、列和索引的统计信息,这些统计信息对于优化器选择合适的执行计划至关...

    十万个为什么_Oracle.docx

    select 'execute dbms_stats.gather_table_stats(ownname => ''HAHA'', tabname => '''||table_name||''', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => ''FOR ALL COLUMNS SIZE AUTO'', ...

    oracle-认证之管理统计信息

    - `dbms_stats.gather_table_stats`: 收集表、列和索引的统计信息。 - `dbms_stats.gather_schema_stats`: 收集模式下所有对象的统计信息。 - `dbms_stats.gather_index_stats`: 收集索引的统计信息。 - `dbms_...

    Oracle 11g收集各种统计信息(DBMS_STAT)

    EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'SCOTT', tabname => 'EMP', method_opt => 'FOR ALL COLUMNS', estimate_percent => '100', degree => '8', granularity => 'ALL', cascade => TRUE); ``` ...

    Oracle运维最佳实践-下.pdf 带书签

    - 使用`DBMS_STATS.GATHER_INDEX_STATS`重新收集索引统计信息。 - **2.1.22 研究B-Tree索引结构的脚本** - B-Tree索引是Oracle中最常用的索引类型之一。 - 本书提供了一个脚本来展示B-Tree索引的内部结构。 - ...

    oracle 函数 oracle函数 存储过程

    exec dbms_job.what(2, 'dbms_stats.gather_table_stats(''scott'',''emp'');'); exec dbms_job.next_date('2', 'sysdate+1'); ``` 通过`DBMS_OUTPUT`和`DBMS_JOB`,开发者可以在Oracle环境中实现高级的调试和自动...

    statspack安装与分析

    2. **比较快照**: 使用`ANALYZE SESSION`或`ANALYZE DATABASE`命令在不同时间点创建快照,然后通过`SELECT * FROM TABLE(dbms_stats.report_schema('STATSPACK_USER'));`查看报告,对比两个快照之间的性能差异。 3. ...

    ORACLE 数据库的统计数据及优化

    相比传统的`ANALYZE TABLE`命令,`dbms_stats`具有更多优势: 1. **高级统计功能**:`dbms_stats`可以更好地处理大型表和分区表,提供更精确的估计。 2. **自动化程度高**:可以通过设置不同的选项来自动决定哪些表...

    oracle性能诊断工具statspack使用指南

    可以使用`DBMS_STATS.PURGE_TABLE`或`DBMS_STATS.PURGE_SCHEMA`删除过期的统计信息。 七、源码分析 虽然Statspack 是预编译的PL/SQL包,但了解其内部工作原理有助于更深入地利用工具。通过查看源码,我们可以理解...

    Oracle 直方图解析.pdf

    DBMS_STATS.GATHER_TABLE_STATS( ownname => USER, tabname => 'YOUR_TABLE_NAME', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY', cascade => TRUE, ...

    结合实例深入讲解oracle中的直方图histogram

    1. **使用`DBMS_STATS`包**:通过`DBMS_STATS`包中的`gather_table_stats`过程来创建直方图是最常用的方法之一。该过程支持多种参数,如`method_opt`参数可以设置为`skewonly`、`repeat`或`auto`等,以控制直方图的...

    [ORACLE]数据库维护整理.pdf

    例如,`DBMS_STATS.GATHER_TABLE_STATS`过程可用于全面或部分收集表的统计信息。 收集统计信息的频率需谨慎权衡,过于频繁可能导致性能下降,而不足则可能导致过时的统计信息导致执行计划错误。对于大型表,可能...

    oracle数据查询慢如何优化.txt

    EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => USER, TABNAME => 'WWFF', ESTIMATE_PERCENT => 20, DEGREE => 10, GRANULARITY => 'ALL', CASCADE => TRUE); ``` 2. **分析表并计算统计信息**:通过`ANALYZE ...

    oracle索引使用样例

    CALL DBMS_STATS.GATHER_TABLE_STATS('MW_APP', 'GD_YX_ZYTDSJ'); ``` 可以通过传递`GRANULARITY => 'PARTITION'`参数来按分区收集统计信息。 - 收集索引统计信息: ```sql CALL DBMS_STATS.GATHER_INDEX_...

    Oracle Statistic 统计信息

    EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME'); ``` 其中,`SCHEMA_NAME`是模式名称,`TABLE_NAME`是要收集统计信息的表的名称。 3. **自动统计信息收集 (Automatic Statistics Gathering):...

    oracle dba

    执行`DBMS_STATS.GATHER_TABLE_STATS`同样不能直接应用更改。 - D. 正确。通过执行`DBMS_REPAIR.SEGMENT_FIX_STATUS`过程,可以使更改立即生效。 因此,正确答案是**D**。 ### 5. 关于临时表空间组的信息 题目...

    ORACLE之FAQ -- 性能调整

    - `DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => USER, ESTIMATE_PERCENT => 100, CASCADE => TRUE);` 这里需要注意的是,从 Oracle 8i 开始,建议使用 `DBMS_STATS` 包而不是 `ANALYZE` 命令来收集统计信息。`DBMS...

    PeopleSoft Enterprise Performance on Oracle 10G

    2. **示例DBMS_STATS命令**:例如,`DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME')`可以收集指定模式下特定表的统计信息。 3. **数据字典表的统计信息**:数据字典表存储了数据库元数据,其统计信息...

Global site tag (gtag.js) - Google Analytics