Fixed Table統計資訊
2 YEARS AGO ORACLE
Oracle有大量的内部視圖供DBA使用,這些視圖底層表以X$開頭,Fixed Objects指的是這些以x$開頭的表(下文中稱為基表)及它們的索引。
很多v$開頭的視圖基表都是x$表,包括動态性能視圖,管理視圖,如dba_free_space等,是以,這些fixed objects的統計資訊就顯得極其重要。
1. Fixed objects統計資訊重要性
優化器在生成執行計劃的時候依賴于這些基表的統計資訊,如果這些基表的統計資訊缺失,不像使用者對象的統計資訊缺失,Oracle會使用dynamic sampling,優化器在這些缺失統計資訊的基表上,會使用預設的預設值進行執行計劃的評估。在這種情況下,執行計劃可能是極其糟糕的。是以,可能存在查詢某些動态性能視圖或者資料字典時,出現很慢的情況。
例如,
X$KTFBUE
記錄了資料檔案、extent的位圖等資訊,在查詢dba_free_space的時候,會使用到這個基表,如果這個表的統計資訊為0,則有可能導緻查詢dba_free_space很慢. 當這個基表缺失統計資訊時,該表的行數預設為10萬行。
| |
-
如何收集
在12c以前,基表的統計資訊是不會通過Oracle自動任務去收集的,需要手動執行下面這個procedure, 使用者需要有sysdba或者
的權限。ANALYZE ANY DICTIONARY
1
exec DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
- 上面這個procedure與
的差別是,它不會收集表/索引的blocks資訊,因為基表是存放在記憶體中随時動态變化的,它們的blocks永遠設定為0.DBMS_STATS.GATHER_TABLE_STATS
- 統計資訊的收集都是會消耗資源,不建議在業務高峰期對任何批量對象進行統計資訊的收集。
-
12c以後,雖然自動任務視窗會收集基表統計資訊,但是,其限制是在視窗時間内,其優先級是最低的,要先等到使用者對象的統計資訊收集完,等資料字典的統計資訊收集完,同時這些基表的統計資訊不存在,即是說,自動視窗不會去更新基表統計資訊的;是以,建議定期手工對基表進行收集。
盡管基表生存周期是在記憶體中,但其統計資訊是會儲存在磁盤中,是以,執行個體重新開機後,除非負載有很大的變化,并沒有必要重新收集統計資訊。
- 上面這個procedure與
2. Fixed tables統計資訊對資料庫的影響
對dba_extents, v$access, V$RMAN_BACKUP_JOB_DETAILS, V$RMAN_STATUS,DBA_FREE_SPACE等視圖有很大影響,很多時候查詢這些視圖很慢,極大可能就是因為基表統計資訊缺失或者存在錯誤的統計資訊。
Reference:
How to Gather Statistics on Objects Owned by the 'SYS' User and 'Fixed' Objects (Doc ID 457926.1)
Fixed Objects Statistics (GATHER_FIXED_OBJECTS_STATS) Considerations (Doc ID 798257.1)
Best Practices for Gathering Optimizer Statistics with Oracle Database 12c Release 2
ORA-01555 Caused By Auto Execute Of Job "SYS"."PMO_DEFERRED_GIDX_MAINT_JOB" (Doc ID 2523018.1)
Database SQL Tuning Guide - Gathering Statistics for Fixed Objects
EOF