多數文章只講單一技巧(如「加索引」),缺乏系統性框架。本文基於計算機硬體效能層級建立五層優化鐵律,提供從診斷到解決的完整方法論。
從快到慢:CPU → Cache (L1-L3) → 記憶體 → SSD → 網路 → 機械硬碟
每層硬體有兩大指標:
核心手段:
索引 DML 代價參考:Insert -56%、Update -47%、Delete -29% 效能下降,寫入密集型系統需謹慎評估。
分頁處理三種模式對比:
| 模式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 客戶端分頁 | 編碼簡單、減少交互 | 首次慢、佔用客戶端記憶體 | 高延遲網路(手機 GPRS、跨國) |
| 應用伺服器分頁 | 單次 SQL 交互 | 大資料量效能差 | 資料量小且可控、DB 不支援分頁 |
| 資料庫 SQL 分頁 | 效能最佳 | 語法複雜、需兩次查詢 | 大多數生產環境 |
Oracle 分頁優化:ROWNUM 直接分頁 vs ROWID 兩階段分頁(純索引定位 ROWID 再回表),後者 I/O 從 550 降至 60(1000筆資料取20筆案例)。
只選需要欄位:減少網路傳輸、伺服器處理、客戶端記憶體,且利於覆蓋索引。大欄位(備註、檔案內容)建議垂直分表隔離。
IN (id1,id2...idn),建議 20-100 個值為宜,超過 1000 觸發 Oracle 限制且易改變執行計畫TYPE_FORWARD_ONLY, CONCUR_READ_ONLY 替代分頁載入 List,效能提升 2 倍+,避免 JVM OOMORDER BY、GROUP BY、DISTINCT、UNION、MERGE JOIN 皆觸發排序。大結果集排序可能溢位至硬碟,效能崩潰。確認不需去重時用 UNION ALLLIKE '%...%'、大型非索引 IN List 耗 CPU。解法:中間表 + Hash Join、str2varList 轉臨時表/*+ PARALLEL(table, 4) */,僅適用全表/索引掃描,OLTP 慎用,會佔用大量資源、繞過快取、觸發髒頁寫入| 層級 | 典型提升 | 實施成本 | 適用階段 |
|---|---|---|---|
| 減少資料存取 | 100-10000x | 低 | 優先 |
| 返回更少資料 | 10-100x | 低 | 次優先 |
| 減少交互次數 | 2-10x | 中 | 再次 |
| 減少 CPU 運算 | 2-5x | 中高 | 精調 |
| 利用更多資源 | 線性擴展 | 高(硬體/架構) | 最後手段 |
優化遵循「由上而下診斷,由下而上解決」原則。先看執行計畫確認 I/O 模式,再依序套用五大鐵律。沒有銀彈,只有系統化的工程思維。