如何收集统计信息

如何收集统计信息

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 =>);

如何收集统计信息

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 =>);


相关文章

  • 数据科学中的"数据智慧"
  • 数据科学中的"数据智慧"* 关键词:数据智慧 应用统计学 作者:郁 彬 译者:张心雨 吕 翔 在大数据时代,学术界和工业界的大量研究都是关于如何以一种可扩展和高效率的方式对数据进行储存.交换和计算(通过统计方法和算法). ...查看


  • 2010年人口普查常见问题解答目录
  • 2010 年人口普查 -- TQA 常见问题解答目录 每十年一次的人口普查期间,美国人口普查局都进行哪些工作? 人口普查局每年都会开展各种普查和调查,并不仅仅是这项每 10 年 1 次的人口普查.通过开展普查,能获得国家在社会和经济状况方面 ...查看


  • 小学数学统计与概率
  • 发表日期:2012年3月18日          [编辑录入:费卫臻] 张 丹 北京教育学院 副教授 贾福录 北京教育科学研究院 中学高级教师 宋燕晖 北京市东城区史家小学分校 中学高级教师 一.数据分析观念的内涵 1. 在实验稿<课 ...查看


  • 如何发展学生的数据分析
  • 如何发展学生的"数据分析观念" 数据分析观念是统计思想的一个重要组成部分.我们可以通过数据分析的教学,使学生体会到统计时需要收集数据,应用数据分析,能解决日常生活中很多实际问题,从而感受统计的实际价值,发展学生的应用意识 ...查看


  • 频数与频率教学反思
  • 篇一:频数与频率(一) 教学设计及教学反思 频数 与频率(一) ●教学目标 (一)教学知识点 1.掌握频数.频率 的概念. 2.会求一组数据的 频数与频率. (二)能力训练要 求 1.通过统计数据, 制成各种图表,增强学生对生活中所见到的统 ...查看


  • 现代交通运输统计调查方法现代研究和探析
  • 摘要:交通运输行业对于我国的经济发展有着很大的影响,我国必须要对其进行统计调查方法的研究,经过近几年的发展,交通运输统计已初步形成一定的指标体系,逐渐形成其应有的格局,但仍有很多的不完善之处,本文就一下几点对现代交通运输统计调查方法进行探析 ...查看


  • 大数据与统计学分析方法比较
  • 摘要: 基于理念分析和比较研究方法,对大数据的分析方法和传统统计学分析方法的关联性和差异进行了对比分析,从方法的基本思想.量化形式.数据来源.分析范式.分析方法.分析视角等角度揭示了两种社会科学分析方法存在的联系与差异. 关键词: 大数据: ...查看


  • 如何有效管理合同档案
  • 如何有效管理合同档案 摘要:合同档案在经济活动中的地位愈来愈重要.然而,由于管理不善,有相当一部分合同无法作为原始依据在日后的经营活动中发挥作用:本文作者结合多年工作经验,就合同档案管理的相关问题进行分析.以供参考. 关键词:合同档案管理 ...查看


  • 仿真实习报告
  • 题目:综合仿真实习个人实习报告 目 录 一.实习单位基本情况 1.信心中心简介 -------------------------1 2.从事岗位的职责 ------------------------1 二.实习概况 (一).实习项目与内 ...查看


热门内容