暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 统计-估计百分比

askTom 2016-04-14
434

问题描述

我们的数据库有几个“自定义”stats收集作业, dbms_stats.gather_table_stats语句到处都是。

我们正在尝试使用默认的统计收集作业来实现标准统计收集。

如何确定在表上收集统计信息时使用的是什么估计百分比值?

DBA_ TABLES有一个示例大小列,该列是否可以用于确定估计值百分比?

谢谢

公元前
MT、MI


专家解答

如果使用dbms_stats.set_table_prefs定义了估计百分比,则可以通过查询user_tab_stat_prefs来找到它:

create table t as
  select rownum x, lpad('x', 1000, 'x') v, sysdate d, rownum*2 i 
 from   dual connect by level <= 100000;

exec dbms_stats.set_table_prefs (user, 't', 'ESTIMATE_PERCENT', 1);
select * from sys.user_tab_stat_prefs ;

TABLE_NAME PREFERENCE_NAME                PREFERENCE_VALUE   
---------- ------------------------------ --------------------
T          ESTIMATE_PERCENT                  1.000000


如果您已经采用了这种方法,那么您可以切换到默认的作业,它的所有处理为您!

如果你在电话中传递了评估结果,我相信你运气不好。不保证示例值与传递的值相同:

drop table t purge;
create table t as
  select rownum x, lpad('x', 1000, 'x') v, sysdate d, rownum*2 i 
 from   dual connect by level <= 100000;

exec dbms_stats.gather_table_stats(user, 't', estimate_percent => 0.005);
select sample_size/100000 * 100 pct from user_tables
where  table_name = 'T';

       PCT
----------
     4.133

exec dbms_stats.gather_table_stats(user, 't', estimate_percent => 1);
select sample_size/100000 * 100 pct from user_tables
where  table_name = 'T';

       PCT
----------
     4.959

exec dbms_stats.gather_table_stats(user, 't', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE);
select sample_size/100000 * 100 pct from user_tables
where  table_name = 'T';

       PCT
----------
       100


MOS说明343849.1讨论了一些原因。

如果收集统计信息调用都在编译的PL/SQL (包、过程或函数)中,则可以查询源:

select * from user_source
where  lower(text) like '%gather%stats%'


然后手动检查调用以查看它们是如何完成的。

=============

只是添加-您非常希望使用AUTO样本大小从11g开始。请参见https://blogs.oracle.com/optimizer/entry/how_does_auto_sample_size为什么
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论