LINQ查询到Azure SQL数据库超时

时间:2015-09-22 05:09:39

标签: c# sql-server azure

我正在查询我在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条记录......我不明白为什么它有时会超时。

2 个答案:

答案 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设置。