【问题标题】:Why does a database query only go slow in the application?为什么数据库查询只会在应用程序中变慢?
【发布时间】:2011-04-19 09:36:32
【问题描述】:

我有一个网页需要 10 分钟才能对数据库运行一个查询,但从 SQL Server Management Studio 运行时,相同的查询会在不到一秒的时间内返回。

网页只是在执行存储过程的数据库中触发 SQL,而该存储过程又对四个表执行非常简单的选择。同样,代码是基本的 ADO,在 SqlCommand 上设置 CommandText,然后执行 ExecuteReader 以获取数据。

网页通常运行速度很快,但是当它变慢时,加快速度的唯一方法是对正在查询的表上的索引进行碎片整理(不同的时间不同),这在相同的情况下似乎没有意义查询手动执行的速度非常快。

我查看了this question,但它并不适用,因为该网页实际上只是在数据库中触发文本。

有没有人有什么好主意,为什么这会在一种方式而不是另一种方式变慢? 谢谢

【问题讨论】:

  • 可能是参数嗅探。您使用的是哪个版本的 SQL Server?如果 SQL Server 2005+ 尝试the query here 让两个计划进行比较。

标签: c# sql sql-server sql-server-2005 performance


【解决方案1】:

我会怀疑参数嗅探。

由于不同的set 选项,用于您的应用程序连接的缓存执行计划可能无法由您的 SSMS 连接使用,因此它将生成一个新的不同计划。

您可以使用以下查询检索存储过程的缓存计划。然后比较看看它们是否不同(例如,慢的一个是否在另一个进行扫描的地方进行索引查找和书签查找?)

Use YourDatabase;

SELECT *
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where sys.dm_exec_sql_text.OBJECTID=object_id('YourProcName') 
         and attribute='set_options'

【讨论】:

  • 这两个执行计划看起来非常相似,但那是因为我已经完成了索引碎片整理吗?
  • 这将导致重新编译计划。估计目前两者在时间上也没有显着差异?
  • 当它再次正常工作时,总是很难发现哪里出了问题;)时间上没有真正的差异,谢谢
  • 假设这是问题所在,您认为需要做些什么来阻止它每隔几周发生一次?
  • @Iain - 您可以使用OPTIMIZE FOR 提示,以便在编译过程时指定编译时使用的参数值,而不是任其自然。
【解决方案2】:

app中查询的命令文本和你手动执行的查询有什么区别吗?既然您说重新索引有助于提高性能(它还会更新统计信息),听起来它可能会陷入糟糕的执行计划。

您可能想要运行 sql 跟踪并捕获 showplanxml 事件以查看执行计划的样子,并捕获完整的 sql 语句(尽管如果大量语句通过系统,这可能会减慢服务器速度,所以小心)以确保发送到 SQL Server 的语句与您手动运行的语句相同。

【讨论】:

  • sql是一样的。下次运行缓慢时,我将尝试分析执行计划,谢谢
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多