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

use*_*221 5 .net c# 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
Run Code Online (Sandbox Code Playgroud)

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

请注意,存储过程始终需要相同的运行时间.

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

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

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

Def*_*ult 4

请确保您没有AUTO_CLOSE设置数据库。根据聊天中的讨论,似乎确实将其设置为ON。

引自微软

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

最佳实践建议

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

AUTO_CLOSE您可以通过运行以下查询来关闭(按照Dan Guzman的建议):

ALTER DATABASE YourDB SET AUTO_CLOSE OFF;
Run Code Online (Sandbox Code Playgroud)