ITPub博客

首页 > 数据库 > Oracle > DBMS_STATS收集统计信息的问题及解决

DBMS_STATS收集统计信息的问题及解决

原创 Oracle 作者:jeanron100 时间:2014-03-06 19:03:31 0 删除 编辑
收集数据库的统计信息是dba工作的一部分,如果在数据快速增长的库上,统计信息如果收集的频率太慢,会对执行计划有一定的影响。
而对于逐渐客户饱和的系统来说,统计信息就可以很长时间收集或者尽量不收集。
对于统计信息的收集,如果是很大的表,收集100%也是不现实的,如果收集的百分比太小,统计信息又失真,对系统系统无疑是雪上加霜。
以上是我采用的方式,不一定对,可以参考。如果表的大小超过30G,算是很大的表了,统计信息的收集比例在30%到40%之间,我给了40%。以下类似。
巨型表(>30G),                     percentage 40%.
大型表(>8G,<30G),              percentage 50%.
中型表(>1G,<8G),               percentage 60%.
小 表(<1G),                        percentage 70%.

对于较大的表,都加了degree.
exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'xxxxx', TABNAME => 'xxxxxx'  ,CASCADE => TRUE, METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE 1', ESTIMATE_PERCENT =>60   ,DEGREE=>2,GRANULARITY =>'ALL');

今天我照例准备了一下脚本,自己先试一下有没有问题。结果出乎意料报错了。
SQL> exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'XXXX', TABNAME => 'XXXXX'                ,CASCADE => TRUE, METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE 1', ESTIMATE_PERCENT =>70   ,DEGREE=>2,GRANULARITY =>'ALL');
BEGIN DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 'XXXX', TABNAME => 'XXXXX'                ,CASCADE => TRUE, METHOD_OPT =>'FOR ALL INDEXED COLUMNS SIZE 1', ESTIMATE_PERCENT =>70   ,DEGREE=>2,GRANULARITY =>'ALL'); END;


*
ERROR at line 1:
ORA-20000: Unable to analyze TABLE "XXXX"."XXXXX",
insufficient privileges or does not exist
ORA-06512: at "SYS.DBMS_STATS", line 23143
ORA-06512: at "SYS.DBMS_STATS", line 23205
ORA-06512: at line 1

我试着用dba用户来执行,结果还是同样的错误。我怀疑是不是bug了,
结果在metalink上转了一圈,有过类似的bug,但在11.2版本都修复了。
最后有一篇文章。Doc ID 1315184.1

CAUSE

Analyze operations against the XDB schema require the 'analyze any dictionary' privilege.

SOLUTION

Grant the required privilege:


SQL> grant analyze any dictionary to adamb;

果然好使。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1102566/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
技术文章每天更新,阵地已转移到微信公众号端。 公众号:jianrong-notes

注册时间:2012-05-14

  • 博文量
    1498
  • 访问量
    14470727