【DB筆試面試648】在Oracle中,當自動收集任務運行時,哪些對象會被收集?

  • 2019 年 10 月 10 日
  • 筆記

題目部分

在Oracle中,當自動收集任務運行時,哪些對象會被收集?

答案部分

存在缺失和陳舊的統計信息的表、索引和分區會被收集。當自動收集任務運行時,優先收集缺失統計信息的對象,然後再收集陳舊統計信息的對象。可以從DBA_TAB_STATISTICS和DBA_IND_STATISTICS這兩個視圖中查詢缺失或陳舊統計信息的對象。「LAST_ANALYZED IS NULL」表示統計信息缺失,「STALE_STATS='YES'」表示統計信息陳舊。當表或分區的數據變化量超過10%時,該對象的統計信息變為陳舊。

在Oracle 11g中對統計信息自動收集的功能進行了加強。在Oracle 10g中,如果表中變更的行數(字典表SYS.MON_MODS_ALL$中記錄的INSERT+UPDATE+DELETE的總數)超過表的總行數(SYS.TAB$中記錄的目標表總記錄數)的10%時或自上次自動統計信息收集作業完成之後目標表被執行過TRUNCATE操作,那麼該表的統計信息就變為陳舊狀態,Oracle就會在指定時間段自動收集統計信息。在Oracle 10g中,這個10%(STALE_PERCENT)是無法修改的,如果表非常大,那麼10%其實是非常多的數據,這就造成統計信息不準確。在Oracle 11g中,這個10%(STALE_PERCENT)是可以修改的,分為全局(DBMS_STATS.SET_GLOBAL_PREFS)、數據庫級別(DBMS_STATS.SET_DATABASE_PREFS)、用戶級別(DBMS_STATS.SET_SCHEMA_PREFS)和表級別(DBMS_STATS.SET_TABLE_PREFS)。其中,數據庫級別和用戶級別都是調用表級別的存儲過程DBMS_STATS.SET_TABLE_PREFS來對錶進行設置的。

表級別的設定如下所示:

l 修改為5%(範圍從1-100):EXEC DBMS_STATS.SET_TABLE_PREFS(USER,'TB_NAME','STALE_PERCENT',5);

l 恢復為10%:EXEC DBMS_STATS.SET_TABLE_PREFS(USER,'TB_NAME','STALE_PERCENT',NULL);

l 查詢表百分比:SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT',USER,'TB_NAME') FROM DUAL;

l 查詢全局百分比:SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT') FROM DUAL;

本文選自《Oracle程序員面試筆試寶典》,作者:小麥苗