c# - 为什么数据库查询只会在应用程序中变慢?

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

我有一个网页需要 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/

相关文章:

Mysql dump 命令与 MS SQL Server 类似

c# - 使用列表的 ArgumentNullException

MySQL : transaction within a stored procedure

sql - PostgreSQL 选择主记录并显示特定记录的详细信息列

SQL返回不同的值然后按日期过滤

sql-server - MSSQL for Linux 上的动态端口

c# - Xamarin.UITest:如何暂停测试步骤

c# - 使用 Mono 的 Chrome native 消息传递

c# - 如何测试返回的数组至少包含一个具有特定属性值的值

MySQL插入数据时JOIN