如果没有打开管理工作室查询窗口,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也没有什么特别的,只有数据源、登录名和密码,没有更多的参数设置。

那么,应用程序的过程如下:

  1. 开始应用
  2. <
  3. 创建连接/gh>
  4. 开放连接
  5. 创建不存在的数据库
  6. 创建不存在的表,并为列添加索引
  7. 启动计时器,执行包含INSERT语句的类
  8. 执行关闭应用程序(不相关)
  9. 关闭事件关闭连接(不相关)
  10. 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 ();
    }
}

如果没有打开管理工作室查询窗口,SqlCommand执行速度会变慢

使用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