我正在查询我在Azure中的sql数据库(实际上我的网络应用程序也在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条记录......我不明白为什么它有时会超时。
答案 0 :(得分:1)
以下是一些提示:
确保您的SQL数据类型与模型中的类型匹配
根据您的代码判断,类型应该是这样的:
UserID
应为int
(通过查看代码无法确定); blnHide
应为bit
; strEmailAddress
应为nvarchar
; strDisplayName
应为nvarchar
; strSubject
应为nvarchar
; 使用索引
您应该在用于过滤和订购数据的列上创建非群集索引。
按重要性排序:
LatestEventTime
; UserID
当您按此列过滤掉大部分数据时; blnHide
; 使用索引进行文本查找
如果稍微更改过滤器行为并仅在列值的开头搜索文本,则可以使用索引进行文本查找。
实现这一目标:
.Contains()
更改.StartsWith()
因为它允许使用索引。 strEmailAddress
列上创建非群集索引:strDisplayName
列上创建非群集索引:strSubject
列上创建非群集索引:尝试免费文字搜索
Microsoft最近才在Azure SQL中引入了全文搜索。您可以使用它来查找通过部分字符串匹配的行。使用EF实现这一点有点复杂,但肯定是可行的。
以下是一些可以帮助您入门的链接:
Entity Framework, Code First and Full Text Search https://azure.microsoft.com/en-us/blog/full-text-search-is-now-available-for-preview-in-azure-sql-database/
答案 1 :(得分:0)
string.Contains(...)转换为WHERE ... LIKE ... sql-statement。这是非常昂贵的。尝试改进您的查询以避免它。 此外,Azure SQL有自己的限制(据我记得5秒,但更好地检查SLA)进行查询运行,因此如果它们更长,它通常会忽略您的web.config设置。