对Azure SQL数据库的LINQ查询超时
本文关键字:LINQ 查询 超时 数据库 Azure SQL | 更新日期: 2023-09-27 18:13:48
我正在查询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
as you order ALL data by this column -
UserID
,因为你过滤掉了这一列的大部分数据; -
blnHide
,当您通过此列过滤掉部分数据时;
使用索引进行文本查找
如果稍微改变过滤器的行为并只在列值的开头搜索文本,则可以使用索引进行文本查找。
实现:
- 将
.Contains()
更改为.StartsWith()
,因为它允许使用索引。 - 在
strEmailAddress
列上创建非聚集索引: - 在
strDisplayName
列上创建非聚集索引: - 在
strSubject
列上创建非聚集索引:
尝试免费文本搜索
微软最近才在Azure SQL中引入全文搜索。您可以使用它来查找按部分字符串匹配的行。使用EF实现这一点有点复杂,但肯定是可行的。
这里有一些链接让你开始:
实体框架,代码优先和全文检索https://azure.microsoft.com/en-us/blog/full-text-search-is-now-available-for-preview-in-azure-sql-database/
string.Contains(…)已转换为WHERE…喜欢……sql语句。这很贵。尝试修改您的查询以避免它。另外,Azure SQL有它自己的限制(据我所知5秒,但最好检查SLA)查询运行,所以它通常会忽略你的web。