一般認知:`LIKE '%關鍵字%'` **前置萬用字元必定掃描**。但在 SQL Server 2008 實測發現特例:
CREATE TABLE Movie (
MovieID INT IDENTITY PRIMARY KEY,
MName NCHAR(50) NOT NULL -- 定長
);
CREATE UNIQUE NONCLUSTERED INDEX IX_Movie_MName ON Movie (MName);
-- 單筆結果
SELECT * FROM Movie WHERE MName LIKE N'%午夜%'; -- 走索引 Seek
SELECT * FROM Movie WHERE MName LIKE N'%午夜%' AND MName LIKE N'%鈴%'; -- 仍走索引 (結果 1 筆)
-- 多筆結果或可變長度欄位
SELECT * FROM Movie WHERE MName LIKE N'%午夜%'; -- 掃描 (若預估 >1 筆)
-- 若 MName 改為 NVARCHAR(50),同樣條件**不走索引**
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 全文檢索 | 自然語言、詞幹、近似、同義詞 | 功能最強、支援語意 | 維護複雜、需獨立服務 (2008 整合) |
| 字首索引 (Computed Column + Index) | 固定前綴查詢 `LIKE '關鍵字%'` | 標準索引 Seek、效能穩定 | 不支援中間/尾部模糊 |
| n-gram / Trigram 索引表 | 任意位置模糊、自動完成 | 通用、可排序 | 儲存膨脹、寫入放大 |
| Elasticsearch / Solr 外部引擎 | 大規模、高併發、複雜查詢 | 專業搜尋功能 | 架構複雜、資料同步延遲 |
`NCHAR + UNIQUE NONCLUSTERED + 單筆結果` 能讓 `LIKE '%xxx%'` 走索引,**是優化器的特例最佳化,非標準行為**。生產系統**請用全文檢索、字首索引或外部搜尋引擎**解決模糊查詢效能問題,切勿仰賴此不可文件化特性。