DBMS_STATS收集統計資訊的問題及解決

jeanron100發表於2014-03-06
收集資料庫的統計資訊是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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章