天天看點

使用dbms_stat采集統計資訊時estimate_percent和cascade的預設值

收集統計資訊可以用dbms_stats包,通常用這樣的文法:exec dbms_stat.gather_table_stats(ownname=>'xxx', tabname=>'xxx', estimate_percent=>xxx, method_opt=>'xxx', cascade=>xxx);

其中estimate_percent表示選擇的采樣比例,如果太低,收集速度會快,但可能不會很準确,如果太高,收集速度會慢,但比較準确,各有利弊。但同時也支援預設方式:exec dbms_stat.gather_table_stats(ownname=>'xxx', tabname=>'xxx');,那這裡收集的采樣比例是多少呢?

做個實驗:

SQL> create table t2 as select * from dba_objects;

Table created.

SQL> select count(*) from t2;

  COUNT(*)

----------

     11218

SQL> create index idx_t2 on t2(object_id);

Index created.

SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS', tabname=>'T2');

PL/SQL procedure successfully completed.

查詢dba_tables表,看到NUM_ROWS值是11218,說明此處采樣比例是100%。

--此處了解有誤,按照官方文檔的介紹,estimate_percent預設值是DBMS_STATS.AUTO_SAMPLE_SIZE,由Oracle根據算法判斷設定的采樣比例,并不是預設為100%,感謝@msdnchina指正,歡迎朋友們繼續指教!

再查詢dba_indexes表,看到索引IDX_T2的相關統計列已經有值了,說明索引也進行了分析,即CASCADE預設值是TRUE。

再次查詢dba_ind_columns表,看到列已經有了值,例如:COLUMN_POSITION、COLUMN_LENGTH等,也證明了CASCADE預設值是TRUE。

總結:

使用dbms_stats.gather_table_stats(ownname=>'SYS', tabname=>'T2');方式采集統計資訊,

1、estimate_percent值預設是100%(其實estimate_percent可以設定為NULL,和100%作用相同,我了解NULL和不設這個值也相同,根據三段論傳遞,那麼不設estimate_percent即預設是100%)。

2、CASCADE預設值是TRUE,即會對表、索引和列都會進行分析采集統計資訊。