DBMS_STATS收集統計資訊的問題及解決
阿新 • • 發佈:2022-05-04
收集資料庫的統計資訊是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;
果然好使。