收集統計資訊可以用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%。
再查詢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,即會對錶、索引和列都會進行分析採集統計資訊。