estimate_percent:采样行的百分比,取值范围[0.000001,100],null为全部分析,不采样. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值. 自动估计要采样的一个segment的最佳百分比: DBA_TABLES: SAMPLE_SIZE NUMBER Sample size used in analyzing this table SQL> select owner, table_name, tablespace_name, sample_size 2 from all_tables 3 where table_name = 'TEST' 4 and owner = 'TEST'; OWNER TABLE_NAME TABLESPACE_NAME SAMPLE_SIZE ---------- -------------------- ------------------------------ ----------- TEST TEST TEST 72605 BEGIN DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST', tabname => 'TEST', estimate_percent => 100, method_opt => 'for all columns size repeat', no_invalidate => FALSE, degree => 8, cascade => TRUE); END; 查看采样率: SQL> SELECT owner, 2 table_name, 3 num_rows, 4 sample_size, 5 trunc(sample_size / num_rows * 100) ectimate_percent 6 FROM DBA_TAB_STATISTICS 7 where table_name = 'TEST' 8 and owner='TEST'; OWNER TABLE_NAME NUM_ROWS SAMPLE_SIZE ECTIMATE_PERCENT ------------------------------ ------------------------------ ---------- ----------- ---------------- TEST TEST 72605 72605 100 改为20呢? SQL> SELECT owner, 2 table_name, 3 num_rows, 4 sample_size, 5 trunc(sample_size / num_rows * 100) ectimate_percent 6 FROM DBA_TAB_STATISTICS 7 where table_name = 'TEST' 8 and owner='TEST'; OWNER TABLE_NAME NUM_ROWS SAMPLE_SIZE ECTIMATE_PERCENT ------------------------------ ------------------------------ ---------- ----------- ---------------- TEST TEST 71720 14344 20 改为自动呢? BEGIN DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST', tabname => 'TEST', estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size repeat', no_invalidate => FALSE, degree => 8, cascade => TRUE); END; SQL> SELECT owner, 2 table_name, 3 num_rows, 4 sample_size, 5 trunc(sample_size / num_rows * 100) ectimate_percent 6 FROM DBA_TAB_STATISTICS 7 where table_name = 'TEST' 8 and owner='TEST'; OWNER TABLE_NAME NUM_ROWS SAMPLE_SIZE ECTIMATE_PERCENT ------------------------------ ------------------------------ ---------- ----------- ---------------- TEST TEST 72605 72605 100 把表搞大呢? SQL> select segment_name,bytes/1024/1024/1024 from dba_segments where segment_name='TEST' and owner='TEST'; SEGMENT_NAME BYTES/1024/1024/1024 --------------------------------------------------------------------------------- -------------------- TEST 1.89355469 还是100% SQL> set linesize 200 SQL> SELECT owner, 2 table_name, 3 num_rows, 4 sample_size, 5 trunc(sample_size / num_rows * 100) ectimate_percent 6 FROM DBA_TAB_STATISTICS 7 where table_name='TEST' 8 and 9 owner='TEST'; OWNER TABLE_NAME NUM_ROWS SAMPLE_SIZE ECTIMATE_PERCENT ------------------------------ ------------------------------ ---------- ----------- ---------------- TEST TEST 9293440 9293440 100 回单位在研究