为什么SSMS打开会影响控制台应用程序

时间:2018-01-15 11:54:43

标签: c# .net sql-server

我有一个控制台应用程序(c#),它打开与sql数据库的连接,执行存储过程然后退出。 存储过程自行计时(使用getdate和datediff)并将计时返回到控制台应用程序。 存储过程总是报告执行大约100毫秒。

重复运行控制台应用程序会提供一致的时序集 (包括ExecuteReader命令的300毫秒)

然而,我偶然发现并可以可靠地重现的是以下效果: 如果我打开SSMS并连接到数据库,然后运行控制台应用程序两次,控制台应用程序中的ExecuteReader第二次显着更快。

请注意,您不必在SSMS中运行甚至打开存储过程,只需连接到数据库

控制台应用程序的第二次运行受到严重影响,并且确实通过打开SSMS并连接到同一数据库来改进 例如

ExecuteReader when SSMS is not open 300 ms
ExecuteReader when SSMS is not open 300 ms
ExecuteReader when SSMS is not open 300 ms
Open SSMS and connect to database
First ExecuteReader when SSMS is open and connected to same database 300 ms
Second ExecuteReader with SSMS open and connected 10 ms !!!
Third ExecuteReader with SSMS open and connected 10 ms
Fourth ExecuteReader with SSMS open and connected 10 ms
Close SSMS
ExecuteReader back to reporting 300 ms to execute

换句话说,为ExecuteReader报告的时间少于存储过程运行所花费的时间

请注意,存储过程总是需要相同的时间才能运行。

似乎SSMS有一种允许控制台应用程序使用的缓存。

任何人都可以对此有所了解吗? sys.dm_exec_connections显示所有各种连接之间没有差异

SSMS是v17.3连接到sql server 2008 R2 SP2数据库

2 个答案:

答案 0 :(得分:4)

确保没有为数据库设置AUTO_CLOSE。根据{{​​3}}中的讨论,似乎确实将其设置为ON。

chat

  

[当] AUTO_CLOSE设置为ON [它]会导致性能下降   频繁访问的数据库,因为增加了开销   每次连接后打开和关闭数据库。 AUTO_CLOSE   还会在每次连接后刷新过程缓存。

     

最佳做法建议

     

如果频繁访问数据库,请将AUTO_CLOSE选项设置为OFF   对于数据库。

您可以通过运行以下查询来转为AUTO_CLOSE(根据Quoted from Microsoft的建议):

ALTER DATABASE YourDB SET AUTO_CLOSE OFF;

答案 1 :(得分:0)

我希望此行为来自Connection Pool Feature。 你可以在控制台应用程序中每次调用后尝试SqlConnection.ClearAllPools