1. 程式人生 > 其它 >DBMS_STATS收集統計資訊的問題及解決

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

收集資料庫的統計資訊是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;

果然好使。