收集数据库的统计信息是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;

 

果然好使。