SQL Server - 事务缓慢

Nic*_*aro -2 performance sql-server sql-server-2008-r2 query-performance

我现在在 SQL Server 2008 R2 中看到了一些行为,我无法确定服务器是否表现不佳。

我已经设置了一个测试,将一个整数插入到一个表中,如下定义,75,000 次。

dbo.Test1
(
    id INT IDENTITY(1,1)
    , [text] VARCHAR(2000)
    , [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
)
Run Code Online (Sandbox Code Playgroud)

插入数据的应用程序(下面的 C# 代码)和 SQL Server 实例都在同一个物理盒子上。

结果:该过程需要将近 10 分钟的时间来循环和插入数据。不太确定这怎么可能。

for (int i = 0; i < 75000; i++)
{
     using (SqlConnection connection = new SqlConnection(@"<server>"))
     {
           connection.Open();

           using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) SELECT '" + i + "'", connection))
           {
                 command.ExecuteNonQuery();
           }

           connection.Close();
     }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

根据@AaronBertrand 的回复更新问题。

我有多大?正如我所指定的,它是一个循环中的整数。我不关心可能会或可能不会出现在文本列中的文本。

什么样的驱动?这是一个 7200 SATA ( http://www.seagate.com/ww/v/index.jsp?vgnextoid=2ee06c02c732f110VgnVCM100000f5ee0a0aRCRD )

数据库很小吗?是的,这是一个可能的问题。

数据库是远程的吗?请更仔细地阅读问题。一切都在同一个物理盒子上,就在我面前。虽然网络上的两个盒子存在同样的问题,但我现在不想调试网络问题。只是 SQL Server 插入问题。

现在在自动增长问题上有很多钱。

编辑2:

再次更新。

机器是虚拟机吗?不。

应用程序连接方法正在研究。由于所有东西都在同一个盒子上,我不确定它是如何连接的。

触发器

资源调控器未设置。

探查器探查器没有显示任何延迟,这让我很烦。

阻塞这是唯一发生的事情,所以不应该有任何阻塞或等待,也许不包括日志等待。在我的盒子上,所有东西都在同一个物理磁盘上。但是,(但是)在其他具有相同问题的盒子上,情况并非如此,因此我目前不会将此视为问题。

db2*_*db2 9

我的预感是它与您的循环打开和关闭连接 75,000 次有关。也许尝试这样的事情,看看会发生什么:

 using (SqlConnection connection = new SqlConnection(@"<server>"))
 {
       connection.Open();

       using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) VALUES (@i)", connection))
       {
             command.Parameters.Add(new SqlParameter("@i", SqlDbType.Int));
             for (int i = 0; i < 75000; i++) {
                 command.Parameters["@i"].Value = i;
                 command.ExecuteNonQuery();
             }
       }

       connection.Close();
 }
Run Code Online (Sandbox Code Playgroud)

编辑:我发现的另一个加速是将所有执行包装在一个事务中(大概这消除了不断锁定和释放锁的开销)。不要SqlTransaction trans = connection.BeginTransaction()实例化你的SqlCommand之前和trans.Commit()之后的工作。以下是我的开发机器上的运行时间:

1:08.14 - 原始版本
0:33.05 - 更改为只打开一次连接,并重用 SqlConnection
0:11.93 - 更改为使用单个事务