本文以 abigale=查詢字串、ada=資料表、alice=欄位為代號,呈現三大優化技巧。
現象:LIKE '%...%' 查詢觸發記憶體溢出。
解法:改用 Recordset Filter 機制,將篩選下推客戶端:
sql = "select * from ada"
rs.filter = "alice like '%" & abigale & "%'"
ck = split(abigale, " ")
sck = UBound(ck)
sql = "select * from ada where "
For i = 0 To sck
' 單欄位 AND 邏輯
SQL = SQL & tempJoinWord & "(alice like '" & ck(i) & "%')"
tempJoinWord = " and "
' 雙欄位 OR+AND 邏輯
SQL = SQL & tempJoinWord & "(alice like '" & ck(i) & "%' or alice1 like '" & ck(i) & "%')"
tempJoinabigale = " and "
Next
LIKE '%關鍵字%' 索引失效;LIKE '關鍵字%' 索引生效。'%關鍵字%' 雙向匹配(含「集市」找「斯卡布羅集市」);'關鍵字%' 僅前綴匹配(找「集市」無結果)。SELECT *,每少一欄位即有速度提升,提升幅度視欄位大小而定。| 方案 | 索引策略 | 查詢語句 | 耗時 |
|---|---|---|---|
| 1 | PK 聚集,無非聚集 | Title/Author LIKE '%kw%' + ORDER BY Id | 50 秒 |
| 2 | Title/Author/Star 非聚集 | Title/Author LIKE 'kw%' + ORDER BY Id | 2-2.5 秒 |
| 3 | 同方案 2 | Title/Author LIKE 'kw%' + ORDER BY Star | 2 秒 |
| 4 | 同方案 2 | Title/Author LIKE 'kw%' 無排序 | 1.8-2 秒 |
| 5 | 同方案 2 | 單欄位 LIKE 'kw%' 無排序 | 1 秒 |
結論:去除前置 % + 建立非聚集索引 + 避免 OR + 單欄位查詢 組合拳,將查詢從 50 秒壓至 1 秒內,提升 50 倍。