針對 Access/SQL Server 常見查詢效能痛點,本文提煉三大技巧:繞過記憶體溢出、多關鍵字動態組合、七條索引與寫法黃金法則,附百萬級實測數據對比,立竿見影。
-- 原寫法 (易溢出) sql = "SELECT * FROM ada WHERE alice LIKE '%" & abigale & "%'" -- 改寫:先全撈再客戶端過濾 (適合小結果集) sql = "SELECT * FROM ada" rs.Filter = "alice LIKE '%" & abigale & "%'"
原理:將 LIKE 推給客戶端 Cursor 過濾,避免引擎處理特殊字元導致記憶體噴增。
ck = Split(abigale, " ") -- 分割關鍵字 sck = UBound(ck) sql = "SELECT * FROM ada WHERE " For i = 0 To sck sql = sql & IIf(i=0, "", " AND ") & "(alice LIKE '" & ck(i) & "%')" Next -- 兩欄位同時查 sql = sql & IIf(i=0, "", " AND ") & "(alice LIKE '" & ck(i) & "%' OR alice1 LIKE '" & ck(i) & "%')" Next
UNION ALL 或拆分查詢。CHARINDEX 同樣導致索引失效,且無顯著優勢。LIKE '%abc%' 索引無效;LIKE 'abc%' 索引有效 (Sargable)。'%集市%' 匹配「斯卡布羅集市」;'集市%' 僅匹配以「集市」開頭的字串。SELECT col1, col2 而非 SELECT *;每減少一欄位,傳輸與解析成本下降,大欄位 (text/image) 效果顯著。| 方案 | 索引策略 | 查詢寫法 | 耗時 |
|---|---|---|---|
| 1 | 無非叢集索引 | WHERE Title LIKE '%kw%' OR Author LIKE '%kw%' ORDER BY ID DESC | 50 秒 |
| 2 | Title, Author, Star 建非叢集索引 | WHERE Title LIKE 'kw%' OR Author LIKE 'kw%' ORDER BY ID DESC | 2-2.5 秒 |
| 3 | 同上 | WHERE Title LIKE 'kw%' OR Author LIKE 'kw%' ORDER BY Star DESC | 2 秒 |
| 4 | 同上 | WHERE Title LIKE 'kw%' OR Author LIKE 'kw%' (無 ORDER BY) | 1.8-2 秒 |
| 5 | 同上 | WHERE Title LIKE 'kw%' (單欄位) | 1 秒 |
OR 仍有開銷,可考慮全文檢索或應用層合併。