【发布时间】:2016-07-20 10:34:32
【问题描述】:
我有一个在 ASP.NET (EF Linq) 中运行大约需要 40 秒的 MS SQL 查询。 我在 Profiler 中捕获了它,它显示了大约 40 秒的持续时间:
但是,当我在 SQL Management Studio 中复制/粘贴它时,它会在 00:00:00 秒内运行。这是一个简单的select 在单个表上(没有联接、视图、存储过程),它返回大约 10.000 行。
执行计划:
我读到this question on StackOverflow女巫指向this blog并放置
设置 ARITHABORT 关闭
在 Management Studio 中的查询上方,但这并不会使其变慢,所以我认为这不是问题所在。
一个奇怪的事情是,我们将应用程序迁移到使用 Windows 2012 / SQL 2014 Web 版的更快的服务器上,从那时起查询似乎运行得更慢了。在我们使用 SQL Express 2008R2 的旧 Windows 2008R2 Server 上,同样的查询确实运行得更快。
【问题讨论】:
-
有许多
SET选项会产生显着的影响,但默认情况下并不相同。我会尝试的第一件事是在 SSMS 和原始 ADO.NET 中运行类似 mssqltips.com/sqlservertip/1415/… 的东西(您可能需要破解查询以使其友好,因为从 ADO.NET 使用PRINT很痛苦, 但是:也许两者都只是select @@OPTIONS就足够了)。查看哪些标志(如果有)不同。我将在本地尝试检查。 -
嗯,在本地检查,唯一的增量是您已经在处理的
ARITHABORT。那么,我想知道这是否是错误的参数优化/查询计划生成。如果您自己编写 SQL,则可以使用OPTIMIZE FOR/UNKNOWN提示。如果您不是自己编写 SQL:那么...是的,这很棘手。我们必须经常这样做——奇怪的是,在内部我们称之为“Jon Skeet / 新用户问题”——我们的数据布局往往严重偏向于新用户和像 Jon 这样的大量参与用户。 -
@Marc,感谢您的帮助。 SQL Studio 给出了
Options = 5496,但从我的应用程序(在实体框架上下文中创建了一个IDbConnection)它给出了Options = 5432。区别确实是ARITHABORT。 -
可能你在 EF 中延迟加载相关字段。如果启用延迟加载,请禁用它并重试
-
我不知道你的表的记录数,但我看到你有一个参数 Date 从 1900-01-01 中选择,这意味着全表扫描,除非你有一个AppCustomerId 上的正确索引。如果您可以发布表和索引定义会有所帮助
标签: asp.net sql-server linq sql-server-2014 database-administration