Oracle 11g數(shù)據(jù)庫的統(tǒng)計信息是指一組用于描述數(shù)據(jù)庫有關(guān)對象的信息,其中包括物理結(jié)構(gòu)、數(shù)據(jù)分布、查詢分析等方面的數(shù)據(jù),它們是優(yōu)化器能夠選擇最佳訪問路徑的基礎(chǔ)。如果沒有統(tǒng)計信息,優(yōu)化器會錯過最佳訪問路徑并導致性能下降。本文將介紹Oracle 11g的統(tǒng)計信息及如何管理它們。
Oracle 11g通過“收集統(tǒng)計信息”功能來生成和更新統(tǒng)計信息。通過以下頁面可以配置自動統(tǒng)計信息收集:Enterprise Manager(EM)數(shù)據(jù)庫控制面板 >數(shù)據(jù)庫實例 >統(tǒng)計信息 >統(tǒng)計信息自動收集。以下是一些重要的統(tǒng)計信息:
- 表和索引的行數(shù)、塊數(shù)和大小。 - 表和索引的臨時段的大小。 - 列的數(shù)據(jù)類型、空值的比例、標稱數(shù)量和唯一數(shù)量。 - 索引的空間、度量、鍵列和索引類型。 - 語句的分布,包括執(zhí)行時間,I / O,CPU,鎖,等待和其它工作負載信息。
自動收集統(tǒng)計信息默認情況下是啟用的,因此Oracle 11g會自動為表和索引收集統(tǒng)計信息。如果需要收集特定表或索引的統(tǒng)計信息,可以使用以下命令:
-- 收集表統(tǒng)計信息 EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'owner_name', TABNAME =>'table_name', CASCADE =>TRUE); -- 收集索引統(tǒng)計信息 EXEC DBMS_STATS.GATHER_INDEX_STATS(OWNNAME =>'owner_name', INDNAME =>'index_name', CASCADE =>TRUE);
需要注意的是,如果在收集統(tǒng)計信息期間發(fā)生直接和間接的DDL操作,則統(tǒng)計信息可能不準確。因此,在收集統(tǒng)計信息之前,最好先確定不會有大量DDL操作。
另外,Oracle 11g還提供了許多視圖來查詢已收集的統(tǒng)計信息。例如:
-- 查詢所有統(tǒng)計信息 SELECT * FROM DBA_TAB_STATS_HISTORY; -- 查詢表的統(tǒng)計信息 SELECT * FROM DBA_TAB_STATISTICS WHERE OWNER = 'owner_name' AND TABLE_NAME = 'table_name'; -- 查詢索引的統(tǒng)計信息 SELECT * FROM DBA_INDEX_STATISTICS WHERE OWNER = 'owner_name' AND INDEX_NAME = 'index_name';
在查詢統(tǒng)計信息時,我們可以使用以下提示來控制統(tǒng)計數(shù)據(jù)的獲取方式:
-- 使用默認的統(tǒng)計信息 SELECT /*+ GATHER_PLAN_STATISTICS */ column1, column2 FROM table_name; -- 只使用預估統(tǒng)計信息 SELECT /*+ OPT_ESTIMATE(table_name) */ column1, column2 FROM table_name;
在使用統(tǒng)計信息時,我們還需要考慮以下幾個因素:
- 當表中有大量數(shù)據(jù)時,相應的統(tǒng)計信息也會增加,因此需要確保收集到足夠的統(tǒng)計信息。
- 當查詢和數(shù)據(jù)分布發(fā)生變化時,我們需要及時更新統(tǒng)計信息以便優(yōu)化器能夠選擇最佳訪問路徑。
- 如果需要快速地收集統(tǒng)計信息,可以使用DBMS_STATS.SET_*_PREFERENCE系列函數(shù)來設置相關(guān)參數(shù),以加速統(tǒng)計信息的收集。
- 通過使用Oracle 11g的Optimizer可視化工具,我們可以更直觀地了解查詢的優(yōu)化過程,從而更好地了解如何分析和管理統(tǒng)計信息。
總之,Oracle 11g數(shù)據(jù)庫的統(tǒng)計信息對于數(shù)據(jù)庫的性能和穩(wěn)定性有著重要的作用,因此我們需要及時和有效地獲取和管理它們。