如果没有打开管理工作室查询窗口,SqlCommand执行速度会变慢
本文关键字:执行 SqlCommand 速度 窗口 管理 管理工作 查询 工作室 如果没有 | 更新日期: 2023-09-27 18:16:16
我目前正在开发一个应用程序,该应用程序应该在SQL Server运行时测试某些场景,例如,PC复位,如果电源掉电。
代码相当简单,我声明了一个静态类,其中包含SqlConnection的声明:public static void CreateConnection(string connectionString)
{
connection = new SqlConnection (connectionString);
}
和两个打开和关闭连接的类(关闭与这个问题无关,但仍然插入它以完成目的):
public static void OpenConnection()
{
if (connection == null) return;
connection.Open ();
}
public static void CloseConnection()
{
if (connection == null) return;
connection.Close ();
}
connectionString也没有什么特别的,只有数据源、登录名和密码,没有更多的参数设置。
那么,应用程序的过程如下:
- 开始应用 <
- 创建连接/gh>
- 开放连接
- 创建不存在的数据库
- 创建不存在的表,并为列添加索引
- 启动计时器,执行包含INSERT语句的类
- 执行关闭应用程序(不相关)
- 关闭事件关闭连接(不相关)
- App关闭(无关)
很抱歉第7到9步,我忍不住要插入它们。
执行INSERT语句的Timer每次以50ms的间隔运行它,当然,从步骤3到6,我从来没有关闭应用程序或连接,我只是让它打开。
现在出现了奇怪的行为,我觉得很有趣,我决定问这里,因为我在网上找不到任何关于它的东西:你可以从字面上注意到我在GUI上插入的计数器的口吃,以跟踪它的执行速度,例如:1 2 3 4 ..5 6 7 8…9 10 11 12....等等,有一个明显的口吃。
现在奇怪的事情来了,只要我打开Management Studio 2014,导航到我的数据库并打开"新查询"窗口,INSERT语句就会在我的应用程序上变得非常快!以前有口吃的东西跑起来就像一辆800马力的高尔夫MK2,绝对像我写它的那一刻所期待的那样流畅,不再像上面解释的那样口吃。
在我关闭管理工作室之后,它又回到了口吃,直到我再次进入新查询的相同过程。它的原因是什么呢?
哦,当然,这是我的INSERT语句,不好意思长读了:
public static void InsertValues(string tableName, string dbName)
{
string query = @"INSERT INTO " + dbName + ".dbo." + tableName + " VALUES ('" + Text + "','" + Date + "')";
using (var command = new SqlCommand (query, connection)) {
command.ExecuteNonQuery ();
}
}
使用ALTER database语句将AUTO_CLOSE数据库选项设置为OFF。您所看到的影响可能是由于在执行命令后数据库被关闭造成的,因为连接被彻底关闭,因此必须完全重新打开整个数据库以执行命令。打开一个查询窗口打开并维护一个连接,从而防止整个数据库的自动关闭。
由于Management Studio和SqlConnection具有不同的SET默认值,因此这些SET命令将自动运行以设置执行环境。SQL Profiler可用于监视SSMS和. net发出的SET命令,以便发现其他差异。您可以使用Profiler监视这些集合命令之间的差异。
你可以像这样在你的c#代码中尝试这些Set语句,并比较结果。
SqlCommand comm = new SqlCommand("SET ARITHABORT ON", connection)
多亏了cynic,我通过将AUTO_CLOSE设置为OFF来修复口吃。我使用了下面的查询,以防将来有人需要它:
EXECUTE sp_MSforeachdb
'
IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model''))
EXECUTE (''ALTER DATABASE [?] SET AUTO_CLOSE OFF WITH NO_WAIT'')
'
我从这里得到的
当然,我这样做只是因为我有几个db,如果你只需要对一个特定的db做:
ALTER DATABASE DBNAME SET AUTO_CLOSE OFF