对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条记录…我不明白为什么有时会超时。

对Azure SQL数据库的LINQ查询超时

以下是一些建议:

确保您的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。