透過 V$SYSSTAT 或 Statspack 報告可觀察兩個關鍵計數器:
table scans (short tables):小表全表掃描次數table scans (long tables):大表全表掃描次數若 long tables 計數偏高,通常伴隨 db file scattered read 等待事件顯著,意味著大量大表全掃導致 I/O 壓力。
Oracle 內部參數 _small_table_threshold 決定大小表門檻。預設值 = Buffer Cache 區塊數的 2%。
驗證範例(Oracle 9iR2):
SQL> SHOW PARAMETER db_cache_size
db_cache_size = 83886080 (80MB)
SQL> SELECT (83886080/8192)*2/100 FROM DUAL; -- 區塊大小 8K
結果:204.8 ≒ 200 (參數值)
表區塊數 < 200 視為小表,≥ 200 視為大表。
| 類別 | 全表掃描行為 | 緩衝池影響 |
|---|---|---|
| 小表 | 區塊讀入 LRU 列表「熱端」(MRU 端),優先保留 | 減少熱門小表重複讀取 I/O |
| 大表 | 區塊讀入 LRU 列表「冷端」(LRU 端),快速老化淘汰 | 避免大表掃描沖刷熱點資料,防止緩衝池抖動 |
Oracle 8i 引入三大緩衝池,從建表即可指定,突破單一 LRU 限制:
語法範例:CREATE TABLE t (...) STORAGE (BUFFER_POOL KEEP);
table scans (long tables) 趨勢,異常上升需檢視 SQL 執行計劃。_small_table_threshold(需 Oracle 支援建議),通常不建議動態修改隱含參數。