我有一个网页需要 10 分钟才能对数据库运行一次查询,但从 SQL Server Management Studio 运行时,相同的查询会在不到一秒内返回。
该网页只是在执行存储过程的数据库中触发 SQL,而该存储过程又对四个表执行非常简单的选择。同样,代码是基本的 ADO,在 SqlCommand 上设置 CommandText,然后执行 ExecuteReader 以获取数据。
该网页通常运行速度很快,但是当它变慢时,唯一可以加快速度的方法是对正在查询的表上的索引进行碎片整理(不同的时间不同),这在相同的情况下似乎没有意义查询手动执行得如此之快。
我看过this question但它并不适用,因为网页实际上只是在数据库中触发文本。
有没有人知道为什么这会以一种方式变慢而不是另一种方式变慢? 谢谢
最佳答案
我怀疑参数嗅探。
由于不同的 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'
关于c# - 为什么数据库查询只会在应用程序中变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3831644/