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

30 萬筆資料文本欄位搜尋效能實測:直查 vs 函數 vs 檢視表 vs 預存程序 vs 索引類型

     編輯:關於SqlServer

測試環境

  • 資料筆數:300,000
  • 結構:有 ID 欄位但無主鍵,Category 欄位建有非叢集索引
  • 查詢條件:WHERE Category LIKE '%醫學%' (前導萬用字元,索引無法 Seek)

測試方法與結果

方法T-SQL 範例執行時間 (ms)備註
直接查詢SELECT Title FROM Books WHERE Category LIKE '%醫學%'~1,100非叢集索引略優於叢集索引
使用者定義函數SELECT Title FROM dbo.gethl('醫學')1,150~1,200函數呼叫額外開銷
預存程序EXEC getfl '醫學'~1,100與直接查詢相近
檢視表SELECT Title FROM View1~1,100展開後同直接查詢

結論

  1. 封裝方式 (直查/函數/SP/View) 差異極小,瓶頸在 LIKE '%...%' 導致全索引掃描 (Index Scan)
  2. 非叢集索引優於叢集索引:非叢集索引較窄 (僅含 Category + 書籤),掃描 I/O 較少
  3. 真正的優化方向:全文檢索 (Full-Text Search) 或 倒排索引表 (另建關鍵字對應表),可將查詢降至 < 10 ms

進階建議

  • SQL Server 2008+ 使用 FULLTEXT INDEX + CONTAINS/FREETEXT
  • 自建關鍵字表:Keyword (kw, book_id),查詢轉為 JOIN + WHERE kw = '醫學' (可 Seek)
  • 若必須用 LIKE,將前導 % 移除 (如 LIKE '醫學%') 才能用到索引 Seek
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved