我有一个控制台应用程序(C#),它连接到SQL数据库,执行存储过程,然后退出。
存储过程使用getdate和datediff来计时,并将计时结果返回给控制台应用程序。
存储过程始终报告执行时间约为100毫秒。
重复运行控制台应用程序会得到一组一致的计时结果 (包括ExecuteReader命令花费的300毫秒)。
然而我偶然发现并能够可靠地复现以下效果: 如果我打开SSMS并连接到数据库,然后运行两次控制台应用程序,则第二次控制台应用程序中的ExecuteReader显著更快。
请注意,您不必在SSMS中运行或甚至打开存储过程,只需连接到数据库即可。
通过打开且连接到相同数据库的SSMS,第二次运行控制台应用程序受到了显着影响和改善。 例如:
重复运行控制台应用程序会得到一组一致的计时结果 (包括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数据库。