C# 为什么数据库查询在应用程序中运行缓慢?
我有一个网页,对数据库运行一个查询需要10分钟,但从SQLServerManagementStudio运行时,相同的查询在不到一秒钟的时间内返回 该网页只是在执行存储过程的数据库中触发SQL,而存储过程又对四个表执行非常简单的选择。同样,代码是基本ADO,在SqlCommand上设置CommandText,然后执行ExecuteReader以获取数据 网页通常工作得很快,但当它变慢时,加快速度的唯一方法是对被查询表上的索引进行碎片整理(不同的索引和不同的时间),当手动执行相同的查询时,这似乎没有意义 我已经看过了,但它不适用,因为网页实际上只是在数据库中发射文本 有没有人有什么好主意,为什么这是一个缓慢的方式,而不是其他?C# 为什么数据库查询在应用程序中运行缓慢?,c#,sql,sql-server,sql-server-2005,performance,C#,Sql,Sql Server,Sql Server 2005,Performance,我有一个网页,对数据库运行一个查询需要10分钟,但从SQLServerManagementStudio运行时,相同的查询在不到一秒钟的时间内返回 该网页只是在执行存储过程的数据库中触发SQL,而存储过程又对四个表执行非常简单的选择。同样,代码是基本ADO,在SqlCommand上设置CommandText,然后执行ExecuteReader以获取数据 网页通常工作得很快,但当它变慢时,加快速度的唯一方法是对被查询表上的索引进行碎片整理(不同的索引和不同的时间),当手动执行相同的查询时,这似乎没有
谢谢我怀疑参数嗅探 由于不同的
set
选项,用于应用程序连接的缓存执行计划可能无法被SSMS连接使用,因此它将生成新的不同计划
您可以使用下面的查询来检索存储过程的缓存计划。然后比较它们是否不同(例如,速度慢的一个是否在另一个进行索引查找和书签查找的位置进行扫描?)
应用程序中查询的命令文本与您手动执行的查询之间是否存在差异?既然您说过重新编制索引有助于提高性能(这也会更新统计数据),那么听起来它可能陷入了一个糟糕的执行计划
您可能需要运行sql跟踪并捕获showplanxml事件,以查看执行计划的外观,还需要捕获sql语句完成(尽管如果系统中有大量语句,这可能会降低服务器速度,因此请小心)确保发送到SQL server的语句与手动运行的语句相同。可能是参数嗅探。您使用的是哪个版本的SQL Server?如果SQL Server 2005+尝试比较这两个计划。这两个执行计划看起来非常相似,但这是否是因为我已经完成了索引碎片整理?这将导致重新编译计划。想必目前两者在时间安排上也没有显著差异?当它再次正常工作时,总是很难发现哪里出了问题;)感谢您,在计时方面没有真正的差异。假设这就是问题所在,您认为需要做些什么来阻止它每隔两周发生一次?@Iain-您可以使用
OPTIMIZE FOR
提示,以便在编译过程时指定编译时使用的参数值,而不是让它发生。sql是相同的。下次执行计划进展缓慢时,我将尝试分析执行计划,谢谢
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'