gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:20:09 25 4
gpt4 key购买 nike

我有一个控制台应用程序 (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数据库

最佳答案

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

Quoted from Microsoft

[When] AUTO_CLOSE is set ON [it] can cause performance degradation on frequently accessed databases because of the increased overhead of opening and closing the database after each connection. AUTO_CLOSE also flushes the procedure cache after each connection.

Best Practices Recommendations

If a database is accessed frequently, set the AUTO_CLOSE option to OFF for the database.

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

ALTER DATABASE YourDB SET AUTO_CLOSE OFF;

关于c# - 为什么打开 SSMS 会影响控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48262494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com