前言
資料庫存取是動態網站效能的關鍵瓶頸。本文整理 10 項針對 ASP + ADO + SQL Server/Access 的實戰優化守則,助您大幅降低回應時間、提升併發承載。
優化守則
- 建立適當索引: 依查詢 `WHERE`、`JOIN`、`ORDER BY` 欄位建立索引;定期 `DBCC SHOW_STATISTICS` 更新統計資料;避免過度索引增加寫入負擔。
- 善用預存程序: 預編譯執行計畫、減少網路傳輸、封裝業務邏輯;僅回傳必要欄位與列集,避免 `SELECT *` 後在 ASP 端過濾。
- 選擇正確資料庫引擎: 多使用者環境**必須用 SQL Server**,Access (Jet) 僅適合單機、低併發;連接字串使用 **OLE DB / DSN-less** (如 `Provider=SQLOLEDB;...`),效能優於 ODBC DSN。
- 棄用 DAO/RDO,全面採用 ADO: DAO/RDO 設計為單使用者桌面應用;ADO 專為 Web 多執行緒、連接池設計。
- 精確設定 Recordset 游標與鎖定:
- 唯讀、單向瀏覽 → `adOpenForwardOnly` + `adLockReadOnly` (預設,效能最佳)。
- 需更新 → `adOpenKeyset` / `adOpenDynamic` + `adLockOptimistic` / `adLockBatchOptimistic`。
- 大量資料唯讀 → 考慮 `adUseClient` 游標離線處理。
- 減少 COM 物件屬性存取: 循環中重複讀取 `RS("Field")` 會跨 COM 邊界。先存入區域變數:`val = RS("Field")` 再運算/輸出。
- 不要快取 Connection 物件: Application/Session 級快取連接會造成爭用、破壞連接池。**每個 ASP 頁面建立、使用、立即釋放** (`Close`, `Set = Nothing`),IIS 內建連接池會高效複用實體連接。
- 避免 `SELECT *`: 明確列出所需欄位,減少網路傳輸、磁碟 I/O、記憶體佔用,特別是含大型欄位 (text, image, varchar(max)) 的資料表。
- 及時關閉 Recordset 與 Connection: 釋放資源防止連接洩漏導致伺服器掛點。標準模式:
RS.Close: Set RS = Nothing
Conn.Close: Set Conn = Nothing
- OLE DB 直連語法 (SQL Server):
strConn = "Provider=SQLOLEDB.1;Password=xxx;Persist Security Info=True;User ID=sa;Initial Catalog=MyDB;Data Source=MyServer;Connect Timeout=15"
實測比 ODBC DSN / DSN-less 快 20-30% (參考 Wrox ADO 2.0 程式員參考測試)。
效能比較參考 (Wrox 測試)
| 連接方式 | SQL Server | Access |
| OLE DB (SQLOLEDB) | 基準 (最快) | 基準 (最快) |
| ODBC DSN | 慢 ~15% | 慢 ~25% |
| ODBC DSN-less | 慢 ~10% | 慢 ~20% |
結語
資料庫優化非一蹴而可,需結合索引維護、查詢重寫、連接管理、架構調整持續迭代。上述 10 條守則為 ASP 開發者的基礎功夫,貫徹執行即可見效。