我有一个网页,需要10分钟才能对数据库运行一个查询,但从SQL Server Management Studio运行时,相同的查询会在不到一秒的时间内返回。
网页只是在执行存储过程的数据库中触发SQL,而后者又在四个表上执行非常简单的选择。代码再次是基本的ADO,在SqlCommand上设置CommandText,然后执行ExecuteReader来获取数据。
网页通常可以很快地运行,但是当它减慢时,加速它的唯一方法是对正在查询的表上的索引进行碎片整理(不同的时间不同),这在相同的情况下似乎没有意义查询可以手动执行。
我查看了this question但它不适用,因为网页实际上只是在数据库中触发文本。
有没有人有任何好的想法为什么这种方式变慢而不是另一种方式? 感谢
答案 0 :(得分:4)
我怀疑参数嗅探。
由于不同的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'
答案 1 :(得分:1)
应用程序中查询的命令文本与您手动执行的查询之间是否有任何区别?既然你说重建索引有助于提高性能(这也会更新统计数据),听起来它可能会陷入糟糕的执行计划。
您可能希望运行sql跟踪并捕获showplanxml事件以查看执行计划的外观,并捕获sql语句完成(尽管如果很多语句通过系统进行,这可能会降低服务器速度小心)确保发送到SQL Server的语句与您手动运行的语句相同。