Oracle統計信息
統計信息主要是描述數據庫中表,索引的大小,規模,數據分布狀況等的一類信息。例如,表的行數,塊數,平均每行的大小,索引的leaf blocks,索引字段的行數,不同值的大小等,都屬於統計信息。CBO正是根據這些統計信息數據,計算出不同訪問路徑下,不同join 方式下,各種計划的成本,最后選擇出成本最小的計划。
統計信息是存放在數據字典表中的,如tab$,一般可通過察看某些視圖來獲取統計信息狀況,如DBA_TABLES,DBA_INDEXES,DBA_TAB_COL_STATISTICS, DBA_TAB_HISTOGRAMS等。在這些視圖中包含表示統計信息的一些字段,這些字段只有搜集過統計信息之后才有值,否則是空的。例如,last_analyzed 字段表示上次統計信息搜集的時間,可以根據這個字段,快速的了解最近一次統計信息搜集的時間。
oracle會按自己的規則自動收集統計信息,但是有時候需要自己手動收集統計信息,比如大規模etl導入數據時。
手動收集信息方式:
DBMS_STATS.GATHER_TABLE_STATS的語法如下: DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, estimate_percent NUMBER,block_sample BOOLEAN,method_opt VARCHAR2,degree NUMBER, granularity VARCHAR2, cascade BOOLEAN,stattab VARCHAR2,statid VARCHAR2, statown VARCHAR2,no_invalidate BOOLEAN, force BOOLEAN); 參數說明: ownname:要分析表的擁有者 tabname:要分析的表名. partname:分區的名字,只對分區表或分區索引有用. estimate_percent:采樣行的百分比,取值范圍[0.000001,100],null為全部分析,不采樣.常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默認值,由oracle決定最佳取采樣值. block_sapmple:是否用塊采樣代替行采樣. method_opt:決定histograms信息是怎樣被統計的.method_opt的取值如下(默認值為FOR ALL COLUMNS SIZE AUTO): for all columns:統計所有列 的histograms. for all indexed columns:統計所有indexed列的histograms. for all hidden columns:統計你看不到列的histograms for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY:統計指定列的histograms.N的取值范圍[1,254];REPEAT上次 統計過的histograms;AUTO由oracle決定N的大小;SKEWONLY 選項會耗費大量處理時間,因為它要檢查每個索引中的每個列的值的分布情況。 degree:決定並行度.默認值為null. granularity:Granularity of statistics to collect ,only pertinent if the table is partitioned. cascade:是收集索引的信息.默認為FALSE. stattab:指定要存儲統計信息的表,statid如果多個表的統計信息存儲在同一個stattab中用於進行區分.statown存儲統計信息表的擁有者.以上三個參數若不指定,統計信息會直接更新到數據字典. no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE. force:即使表鎖住了也收集統計信息