優化 SQL 不僅是調整索引,更是對業務邏輯、資料分佈與執行計畫的深度理解。以下 22 條建議涵蓋查詢重寫、索引策略、連接優化與進階特性應用,助您編寫出高效、穩定的 SQL 程式碼。
IN/EXISTS 子查詢轉換為 JOIN,或使用 WITH 子句(CTE)物化中間結果,減少重複掃描。NOT IN 在含有 NULL 值時語義陷阱多,且難以利用索引;NOT EXISTS 語義明確,通常能走反連接(Anti-Join)優化。WHERE col LIKE 'ABC%' 可利用索引範圍掃描,而 SUBSTR(col,1,3)='ABC' 會導致函數索引失效(除非建立函數索引)。WHERE 條件或連接鍵中適當使用 NVL(col, 'default') 避免隱性轉換,但需注意可能阻礙索引使用,建議改寫為 col IS NULL OR col = 'val'。OR 條件涉及不同列索引時,拆分為多個 UNION ALL 子查詢可分別利用各自索引,再合併結果(注意去重邏輯)。ENABLE NOVALIDATE)或載入歷史資料時,非唯一索引可避免唯一索引的嚴格檢查鎖衝突。AND/OR/NOT 邏輯運算可快速合併 Rowid 集合;嚴禁用於高並發 OLTP 寫入場景。@dblink)網路延遲高、難以優化執行計畫,盡量在本地複制資料或使用同步機制。USE_NL、USE_MERGE、USE_HASH Hint 或調整驅動表大小,引導最佳化器選擇巢狀迴圈、排序合併或雜湊連接。addBatch()、OCI OCIStmtExecute 陣列模式可大幅減少網路往返與解析開銷。DBMS_SQL 原生動態 SQL,EXECUTE IMMEDIATE 程式碼更簡潔、效能更優(內部最佳化)。PGA_AGGREGATE_TARGET 自動管理)。總結: SQL 優化無銀彈,需結合業務場景、資料量級、並發特性綜合權衡。養成「先 EXPLAIN PLAN、再實測、後上線」的習慣,方能行穩致遠。