Oracle資料庫中的統計信息是這樣一組數據:它存儲在數據字典中,且從多個維度描述了Oracle資料庫里對象的詳細信息。 CBO會利用這些統計信息來計算目標SQL各種可能的,不同的執行路徑的成本,從中選擇一條成本最小的執行路徑來作為目標SQL的執行計劃。 統計信息分為以下六種: 表的統計信息 索引的 ...
Oracle資料庫中的統計信息是這樣一組數據:它存儲在數據字典中,且從多個維度描述了Oracle資料庫里對象的詳細信息。 CBO會利用這些統計信息來計算目標SQL各種可能的,不同的執行路徑的成本,從中選擇一條成本最小的執行路徑來作為目標SQL的執行計劃。
統計信息分為以下六種:
表的統計信息
索引的統計信息
列的統計信息
系統統計信息
數據字典統計信息
內部對象統計信息:用於描述Oracle資料庫里的一些內部表(如X$系列表)的詳細信息。
收集統計信息
通常有兩種方法
- 使用Analyze命令
- 使用DBMS_STATS包
表、索引、列、數據字典 的統計信息 這兩種方法都可收集。 系統統計信息和系統內部對象統計信息只能使用DBMS_STATS包
Analyze命令用法
- 以計算模式: analyze table abc compute statistics for table; 會掃描目標對象的所有數據,所以統計結果和實際結果相匹配。
- 以估算模式: analyze table abc estimate statistics sample 15 percent for table; 估算模式,估算結果和實際結果不一定完全匹配
DBMS_STATS包用法
- GATHER_TABLE_STATS 用於收集目標表、目標表列和目標表上的索引統計信息
- GATHER_INDEX_STATS 用於收集指定索引的統計信息
- GATHER_SCHEMA_STATS 用於收集指定schema下所有對象的統計信息
-
GATHER_DATABASE_STATS 用於收集全庫所有對象的統計信息
-
估算模式 exec dbms_stats.gather_table_stats(ownname=>'scott' , tabname=>'T2' , estimate_percent=>15 , method_opt=>'FOR TABLE' , cascade=>false);
- 計算模式 exec dbms_stats.gather_table_stats(ownname=>'scott' , tabname=>'T2' , estimate_percent=>100, method_opt=>'FOR TABLE' , cascade=>false); 或者 exec dbms_stats.gather_table_stats(ownname=>'scott' , tabname=>'T2' , estimate_percent=>NULL, method_opt=>'FOR TABLE' , cascade=>false);
Analyze和DBMS_STATS區別
- Analyze命令不能正確地收集分區表的統計信息,而DBMS_STATS包卻可以。
- Analyze命令不能並行收集統計信息,而DBMS_STATS包卻可以。
DBMS_STATS包的並行收集是通過手工指定輸入參數 DEGREE 來實現的,如對錶 T1 並行收集統計信息,同時指定並行度為4:exec dbms_stats.gather_table_stats(ownname=>'scott' , tabname=>'T1' , estimate_percent=>NULL, method_opt=>'FOR TABLE' , cascade=>true , degree=>4); - DBMS_STATS包的缺陷是只能收集CBO相關統計信息,不能收集CBO無關的一些額外信息,Analyze卻可以。
來自為知筆記(Wiz)