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

SQL 效能調優實戰:排序欄位選擇影響執行計畫

     編輯:關於SqlServer

某查詢 ORDER BY CYZoneFeedBack.Time DESC 導致大量 CPU 與排序開銷。經分析執行計畫,發現排序運算子 (Sort) 佔用絕大部分成本。

優化前

SELECT TOP 10 FeedBackID, UserID, ContentID, [Content], Time, AddType, IP
FROM CYZoneFeedBack
WHERE ContentID IN (SELECT ArticleID FROM CyzoneArticle WHERE UserID = @User AND DelFlag = 0 AND PublishType <> 'b')
  AND CYZoneFeedBack.DelFlag = 0
ORDER BY CYZoneFeedBack.Time DESC;

優化前執行計畫含 Sort 運算子

優化後:改用叢集索引鍵排序

發現 FeedBackID 為遞增身分識別欄位,與時間單調遞增高度相關。改為 ORDER BY FeedBackID DESC 後,排序運算子消失,改為索引順序掃描。

SELECT TOP 10 FeedBackID, UserID, ContentID, [Content], Time, AddType, IP
FROM CYZoneFeedBack
WHERE ContentID IN (SELECT ArticleID FROM CyzoneArticle WHERE UserID = 107 AND DelFlag = 0 AND PublishType <> 'b')
  AND CYZoneFeedBack.DelFlag = 0
ORDER BY CYZoneFeedBack.FeedBackID DESC;

優化後執行計畫無 Sort 運算子

核心心得

  • 若排序欄位無索引支援,SQL Server 需額外排序 (Sort 運算子),成本高。
  • 若業務上「時間遞增」與「身分識別欄位遞增」強相關,可用身分識別欄位代替時間排序,利用叢集索引順序免排序。
  • 建立覆蓋索引 INCLUDE (Time) 或調整叢集索引鍵亦可解決,但需權衡寫入開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved