可以使用Oracle內置的程式包DBMS_STATS來查看或修改搜集的資料庫統計信息,本篇主要介紹GATHER_TABLE_STATS過程,通過該過程,可以搜集表和列(或索引)的統計信息。 1 語法 dbms_stats.gather_table_stats(ownname varchar2, ta ...
可以使用Oracle內置的程式包DBMS_STATS來查看或修改搜集的資料庫統計信息,本篇主要介紹GATHER_TABLE_STATS過程,通過該過程,可以搜集表和列(或索引)的統計信息。
1 語法
dbms_stats.gather_table_stats(ownname varchar2,
tabname varchar2,
partname varchar2 default null,
estimate_percent number default default_estimate_percent,
block_sample boolean default false,
method_opt varchar2 default default_method_opt,
degree number default default_degree_value,
granularity varchar2 default default_granularity,
cascade boolean default default_cascade,
stattab varchar2 default null,
statid varchar2 default null,
statown varchar2 default null,
no_invalidate boolean default to_no_invalidate_type(get_param('NO_INVALIDATE')),
stattype varchar2 default 'DATA',
force boolean default false,
-- the context is intended for internal use only.
context dbms_stats.ccontext default null,
options varchar2 default default_options);
標紅的是比較常用的參數。
2 參數說明
重點介紹下麵幾個參數。
2.1 method_opt
method_opt對應的值有如下兩者或者兩者的結合,預設值是FOR ALL COLUMNS SIZE AUTO:
- FOR ALL [ INDEXED | HIDDEN ] COLUMNS [size_clause]
- FOR COLUMNS [column_clause] [size_clause]
size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}
column_clause := column_name | extension name | extension
其中,
- integer:表示直方圖桶的數目,必須在1-2048範圍內;
- REPEAT:僅在已經具有直方圖的列上收集直方圖;
- AUTO:Oracle根據數據分佈和列的工作負責確定要收集直方圖的列;
- SKEWONLY:Oracle根據列的數據分佈確定要收集直方圖的列;
- column_name:列名;
- extension:可以是列組,格式為(column_name,column_name ....),也可以是表達式;
2.2 degree
該參數設置並行度,預設是NULL,意味著使用建表時預設設置的並行度,通過設置並行度,可以提高執行的效率。
2.3 granularity
該參數設置要收集的統計信息的粒度(只在分區表時使用)。值包含:
- ALL:收集所有(子分區、分區、全局)的統計信息;
- APPROX_GLOBAL AND PARTITION:和GLOBAL AND PARTITION相似,但是在這種情況下,全局統計信息是從分區級統計信息聚合而來的,此選項將聚合除列的不同值數和索引的不同鍵值之外的所有統計信息;
- AUTO:預設值,基於分區的類型決定分區的粒度;
- DEFAULT:收集全局和分區級別的統計信息,該選項已過期;
- GLOBAL:收集全局統計信息;
- GLOBAL AND PARTITION:收集全局和分區級別的統計信息,不收集子分區統計信息;
- PARTITION:收集分區級別的統計信息;
- SUBPARTITION:收集子分區級別的統計信息。
對於分區表,建議設置該參數值為ALL。
2.4 cascade
該參數在收集表的統計信息的同時,也會收集索引統計信息,使用此選項等效於運行GATHER_INDEX_STATS過程。
2.5 no_invalidate
該參數值若設為TRUE,則與該表相關聯的游標不會失效,設置為FALSE,則會使對應的游標立即失效,在大批量數據操作,重新收集統計信息時,建議將該參數設置為FALSE,避免因為收集了統計信息,從而使原來的SQL選擇錯誤的執行計劃。
2.6 options
該參數值進一步說明哪些對象收集統計信息,參數值包含:
- GATHER:在所有對象上收集統計信息;
- GATHER AUTO:自動收集所有必要的統計信息,由Oracle隱式確定哪些對象需要新的統計信息。