簡體   English   中英

LINQ查詢到Azure SQL數據庫超時

[英]LINQ query to Azure SQL database timing out

我正在查詢位於Azure中的sql數據庫(實際上我的Web應用程序也位於Azure上)。

每次執行此特定查詢時,錯誤都會不斷變化(例如,有時會發生超時,有時會運行良好,有時會花費非常長的時間)。

我已經注意到我在這里使用ToList方法來枚舉查詢,但是我懷疑這就是它降級的原因。

無論如何,我可以解決這個問題或使其變得更好...., 或者僅使用本機SQL執行查詢嗎?

我還應該注意,在我的webconfig中,我的數據庫連接超時設置為30秒。 這會對性能有好處嗎?

我將可疑代碼放在這里:

case null:    
lstQueryEvents = db.vwTimelines.Where(s => s.UserID == UserId)
                    .Where(s => s.blnHide == false)
                    .Where(s => s.strEmailAddress.Contains(strSearch) || s.strDisplayName.Contains(strSearch) || s.strSubject.Contains(strSearch))
                    .OrderByDescending(s => s.LatestEventTime)
                    .Take(intNumRecords)
                    .ToList();
                    break;

它基本上是在查詢50條記錄...我不明白為什么有時會超時。

這里有一些提示:

確保您的SQL數據類型與模型中的類型匹配

從您的代碼來看,類型應該是這樣的:

  • UserID應該為int (無法通過查看代碼確定);
  • blnHide應該bit ;
  • strEmailAddress應該為nvarchar
  • strDisplayName應該為nvarchar
  • strSubject應該是nvarchar ;

利用索引

您應該在用於過濾和排序數據的列上創建非聚集索引。

按重要性順序:

  • 您通過此列對所有數據進行排序時的LatestEventTime
  • 您通過此列過濾掉大部分數據的UserID
  • 當您通過此列過濾掉部分數據時, blnHide ;

利用索引進行文本查找

如果稍微更改過濾器行為並僅在列值的開頭搜索文本,則可以使用索引進行文本查找。

為實現這一目標:

  • .StartsWith()更改.Contains() ,因為它將允許使用索引。
  • strEmailAddress列上創建非聚集索引:
  • strDisplayName列上創建非聚集索引:
  • strSubject列上創建非聚集索引:

試用免費文本搜索

Microsoft僅在最近才在Azure SQL中引入了全文搜索。 您可以使用它來查找按部分字符串匹配的行。 使用EF來實現這有點復雜,但是肯定是可行的。

以下是一些幫助您入門的鏈接:

實體框架,代碼優先和全文搜索 https://azure.microsoft.com/zh-cn/blog/full-text-search-is-now-available-for-preview-in-azure-sql-database/

string.Contains(...)轉換為WHERE ... LIKE ... sql語句。 這是非常昂貴的。 嘗試改革您的查詢以避免它。 另外,Azure SQL有它自己的限制(據我所知,只有5秒,但最好檢查SLA)以進行查詢運行,因此,如果較長,則通常會忽略web.config設置。

暫無
暫無

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

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