資料庫系統為管理資訊核心,OLTP 與 OLAP 為關鍵應用。查詢操作佔比最高,SELECT 代價最大。百萬級資料全表掃描耗時數十分鐘,優良策略可降至數分鐘。
許多開發者僅重介面忽略查詢效率,導致系統低效。本文結合實務案例與理論,以 Informix 為例闡述優化技巧。
誤以為優化是 DBMS 責任。事實:良好查詢計畫可提升數十倍效能。DBMS 流程:語法檢查 → 查詢最佳化器(代數優化 + 存取路徑優化) → 預編譯產生規劃 → 執行。主流資料庫採基於成本優化,但用戶 SQL 為基礎,糟糕查詢難經系統優化變高效。
JOIN 但非外鍵欄位建索引;不常連接欄位讓最佳化器自動處理GROUP BY/ORDER BY 高頻欄位建索引tbcheck)檢查索引完整性;大量更新後刪除重建索引提速大型表重複排序代價高。最佳化器若能利用索引順序輸出則省略排序。影響因素:
GROUP BY/ORDER BY 順序與索引不符對策:正確增建索引、合理合併表(犧牲正規化換效率)、不可避免時縮小排序範圍。
巢狀查詢中循序存取可能造成災難:3 層巢狀各 1000 行即產生 10 億行掃描。核心解法:對連接欄位建索引。例:學生表與選課表以「學號」連接,必須在學號建索引。
亦可用 UNION 避免循序存取。某些 WHERE 子句會強迫最佳化器採循序存取,需注意改寫。例如:
SELECT * FROM orders WHERE (customer_num = 100 OR customer_num = 200)
# 可能強迫 orders 表循序掃描