[英]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.