簡體   English   中英

提高 Linq SQL 查詢性能

[英]Improve Linq SQL query performance

我有以下 LINQ 查詢在 100 萬條記錄表上運行:

var result = await lmsDb.SendGridEvents
 .Where(s => s.InternalId == internalId && s.Email.ToLower() == email.ToLower())
 .Select(s => new MailEventDTO
 {
   InternalId = s.InternalId,
   Email = s.Email,
   error = s.error,
   Event = s.Event,
   Reason = s.Reason,
   Response = s.Response,
   Url = s.Url,
   TimeStamp = s.TimeStamp
  })
  .OrderByDescending(a => a.TimeStamp) // get the latest
  .FirstOrDefaultAsync();

return result;

如何提高此查詢的性能? 開始變得非常非常緩慢。

檢查數據庫上的排序規則設置。 如果是_CI_這將執行不區分大小寫的字符串比較,因此您不需要執行顯式大小寫轉換。 這將允許 SQL 服務器利用 Email 地址的索引。 如果是_CS_ ,則區分大小寫,這將影響您的表現。 在這種情況下,預先設置變量,只需將ToLower應用於表達式中的實體值。

下一步是在您遇到性能問題的環境中(通常是在生產環境中)查看 Azure SQL 的數據庫顧問。 這將為您提供數據庫性能的整體視圖,包括根據運行的查詢類型為索引更改提供建議。

對於 SQL 服務器,我喜歡使用分析器捕獲正在運行的實際查詢,然后單獨執行這些查詢以檢查正在使用的執行計划,並查找任何索引建議。 例如,在猜測此查詢時,您可能需要一個關於 InternalId ASC、Email ASC 和 Timestamp DESC 組合的索引。 如果您使用_CS_排序規則,那么我懷疑 Email 最好不在索引中,但最終將索引添加/更改/刪除基於顧問的建議。 在創建索引時,請查看工具的建議,因為創建錯誤的索引只會導致存儲膨脹和性能成本,而沒有任何好處。

這應該為您提供一些開始研究的初始位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM