1

我在使用 linq to sql 函数的查询速度上有一个奇怪的不一致。我有一个从 MVC 应用程序调用的函数。这总是非常慢,大约 7 秒。当我从 SQL 管理工作室调用相同的函数时,它有时很慢,有时很快(几分之一秒)。我不确定它什么时候变慢,什么时候变快,但我发现一个周期(除了 MVC 应用程序总是很慢)可以给出一致的结果。

  • 查询在应用程序中运行。这很慢。
  • 我完全按照 LINQ 执行的方式尝试查询。这是形式sp_execute N' select [some] [select] [clauses] from functionname(@p0)', 'declare @p0 decimal(9,0)', @p0=123456789。这在第一次运行和连续运行时也很慢。
  • 我尝试在表单中“展开”查询select [some] [select] [clauses] from functionname(123456789)。这仍然很慢,连续运行也是如此。
  • 我用 alter function [...] 重新定义了这个函数。
  • 运行原始的 sp_execute 查询仍然很慢,在 censecive 运行时也是如此。
  • 运行展开的函数很快。真快。
  • 运行原始 sp_execute 查询现在也非常快。也有不同的@p0 参数。
  • 查询在应用程序中运行。我们又变慢了。

我完全不知道为什么会发生这种情况,以及如何解决它。感觉它与缓存的执行计划或类似的东西有关,但我对此知之甚少,无法确切知道发生了什么 - 或如何解决它。有谁知道发生了什么?

4

3 回答 3

1

这听起来像参数嗅探:

https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/ http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-参数嗅探.aspx

文章对其进行了很好的描述,但简而言之:引擎根据传入的参数对优化查询做出了一些假设,这导致性能低于最佳性能。

于 2013-10-28T13:59:13.413 回答
1

该问题可以通过参数嗅探问题以及MVC 应用程序和 SQL Management Studio 之间的不同执行设置来解释。差异可能是巨大的。

根据执行设置的附加信息可以在这里找到

其中,文章http://www.sommarskog.se/query-plan-mysteries.html中还有一些其他提示

而且,当然,为了检查正确性,需要清理已兑现的飞机: DBCC FREEPROCCACHEDBCC 删除缓冲区

于 2013-10-29T13:24:23.900 回答
0

查询在 SQL Management Studio 上第一次执行时花费时间而随后花费较少时间的原因是由于执行查询时,数据存储在 SQL Server 缓存中。并且当再次执行相同的查询时,将从缓存中获取数据。

要查看查询所用的确切时间,您需要在运行查询之前清除缓存,这可以通过

DBCC FREEPROCCACHE

DBCC 删除缓冲区

于 2013-10-30T08:14:50.010 回答