首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 查詢優化 3 大實戰技巧:從 LIKE 改寫到索引策略與欄位裁剪

     編輯:關於SqlServer

針對 Access/SQL Server 常見查詢效能痛點,本文提煉三大技巧:繞過記憶體溢出、多關鍵字動態組合、七條索引與寫法黃金法則,附百萬級實測數據對比,立竿見影。

技巧一:Access 含日文/特殊字元導致記憶體溢出

-- 原寫法 (易溢出)
sql = "SELECT * FROM ada WHERE alice LIKE '%" & abigale & "%'"
-- 改寫:先全撈再客戶端過濾 (適合小結果集)
sql = "SELECT * FROM ada"
rs.Filter = "alice LIKE '%" & abigale & "%'"

原理:將 LIKE 推給客戶端 Cursor 過濾,避免引擎處理特殊字元導致記憶體噴增。

技巧二:類百度多關鍵字查詢 (空格分隔 → AND 組合)

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

技巧三:七條提升查詢效率的鐵律 (SQL Server 實測)

  1. 慎用 OR:導致全表掃描,改用 UNION ALL 或拆分查詢。
  2. CHARINDEX 不優於 LIKE:CHARINDEX 同樣導致索引失效,且無顯著優勢。
  3. 前置 % 殺死索引:LIKE '%abc%' 索引無效;LIKE 'abc%' 索引有效 (Sargable)。
  4. 前置 % 與無前置 % 語意不同:'%集市%' 匹配「斯卡布羅集市」;'集市%' 僅匹配以「集市」開頭的字串。
  5. 欄位按需提取:SELECT col1, col2 而非 SELECT *;每減少一欄位,傳輸與解析成本下降,大欄位 (text/image) 效果顯著。
  6. ORDER BY 走叢集索引最快:每表僅一叢集索引 (預設 PK),按其排序免排序運算。
  7. 建立適當非叢集索引:百萬級表測試 (P4 2.8G/1G/IDE):

百萬級測試對比 (表 News, 100萬行, PK=ID 叢集索引)

方案索引策略查詢寫法耗時
1無非叢集索引WHERE Title LIKE '%kw%' OR Author LIKE '%kw%' ORDER BY ID DESC50 秒
2Title, Author, Star 建非叢集索引WHERE Title LIKE 'kw%' OR Author LIKE 'kw%' ORDER BY ID DESC2-2.5 秒
3同上WHERE Title LIKE 'kw%' OR Author LIKE 'kw%' ORDER BY Star DESC2 秒
4同上WHERE Title LIKE 'kw%' OR Author LIKE 'kw%' (無 ORDER BY)1.8-2 秒
5同上WHERE Title LIKE 'kw%' (單欄位)1 秒

結論

  • 「去前置 % + 建非叢集索引」是提升 LIKE 查詢效能的核心組合拳。
  • 單欄位查詢最快;多欄位 OR 仍有開銷,可考慮全文檢索或應用層合併。
  • 排序欄位若非叢集索引,增加排序成本;無排序最快。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved