我有一个控制台应用程序(c#),它打开到sql数据库的连接,执行存储过程,然后退出。存储过程自己计时(使用getdate和datediff),并将时间返回到控制台应用程序。存储过程总是报告执行时间大约为100毫秒。
反复运行控制台应用程序会给出一致的时间集(包括ExecuteReader命令的300 ms )。
然而,我偶然发现并能够可靠地再现以下效果:如果打开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数据库
发布于 2018-01-15 13:44:58
发布于 2018-01-15 12:38:37
我希望这种行为来自于连接池特性。您能在控制台应用程序中每次调用之后尝试一个SqlConnection.ClearAllPools吗?
https://stackoverflow.com/questions/48262494
复制相似问题