使用等待类型LCK_M_RIn_LN执行BULK Insert SUSPENDED

时间:2013-07-25 11:37:49

标签: sql sql-server vb.net winforms database

我在进行BULK插入时遇到了很多问题。我实际上是使用SqlBulkCopy将多个行插入表中。首先,我会得到Timeout异常。所以,我将SqlBulkCopy的BulkCopyTimeout设置为荒谬的[?] 1800秒。不会抛出异常(尚未)。所以,我从MS Server管理工作室检查了活动监视器(如此处所示:Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The statement has been terminated)并看到我的BULK INSERT的任务状态被暂停,等待类型为LCK_M_RIn_LN。我的代码如下:

Using sqlCon As SqlConnection = connection.Connect()
   Dim sqlBulkCopy As New SqlBulkCopy(sqlCon, SqlBulkCopyOptions.CheckConstraints And
   SqlBulkCopyOptions.FireTriggers And
   SqlBulkCopyOptions.KeepNulls And
   SqlBulkCopyOptions.KeepIdentity, sqlTran)

   sqlBulkCopy.BulkCopyTimeout = 1800 ' is this ridiculous?
   sqlBulkCopy.BatchSize = 1000
   sqlBulkCopy.DestinationTableName = destinationTable
   sqlBulkCopy.WriteToServer(dataTableObject)

   sqlTran.Commit()
End Using

我一直在寻找网络上的解决方案,但无济于事。虽然我发现了这个LCK_M_RIn_LN的定义:

  

当任务正在等待获取当前键值的NULL锁定以及当前键和上一键之间的“插入范围”锁定时发生。密钥上的NULL锁定是即时释放锁定。有关锁兼容性矩阵,请参见sys.dm_tran_locks(Transact-SQL)。

来自http://msdn.microsoft.com/en-us/library/ms179984.aspx

但它没有帮助。愿有人帮助我。我最深切的感谢。

修改

我认为这是因为KeepIdentity属性,因为主键是自动递增的。这是根据SqlBulkCopy Insert with Identity Column。我会看看它是否解决了我的问题。

编辑2

我不知道发生了什么,但是当我在管理工作室(使用直接transact-sql)测试时,BULK插入工作正常。我不知道。也许是SqlBulkCopy。当我检查活动监视器时,它生成的查询是:

insert bulk TableName ([ColumnName] Int)

编辑3

我忘了写我实际上正在使用Entity Framework所以我复制了一个代码(实际上是从c#翻译成vb),它会从实体对象创建一个DataTable,因为EntityDataReader只适用于C#(这让我心疼) 。但无论如何。我删除了SqlBulkCopy的东西,只是将值存储在XML中,因为当我看到它时,我意识到我不需要数据库中的值。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的尝试,尝试从Java批量插入,但是使用等待类型ASYNC_NETWORK_IO,例如

+-----------+-------+-------------+---------+--------+----------------+--------------------------------------+
|  Status   | BlkBy |   Command   | CPUTime | DiskIO |   LastBatch    |             ProgramName              |
+-----------+-------+-------------+---------+--------+----------------+--------------------------------------+
| SUSPENDED | .     | BULK INSERT |      15 |      4 | 09/16 02:42:04 | Microsoft JDBC Driver for SQL Server |
+-----------+-------+-------------+---------+--------+----------------+--------------------------------------+                          

很难说出确切的问题是什么,我观察到了一些事情:

一旦我解决了这些问题,那么满负荷就会按预期工作。

我生成的批次大小/行的一些统计信息(请注意数据正在穿越大西洋),但关键是性能非常可变。

+------------+------+----------+----------+----------+
| batch size | rows |  start   |   end    | duration |
+------------+------+----------+----------+----------+
|        100 | 2500 | 09:15:45 | 09:18:17 | 00:02:32 |
|       1000 | 2500 | 09:23:34 | 09:25:35 | 00:02:00 |
|       2500 | 2500 | 09:32:53 | 09:34:55 | 00:02:01 |
|       2500 | 7500 | 10:27:18 | 10:30:49 | 00:03:31 |
|       7500 | 7500 | 10:38:10 | 10:45:57 | 00:07:47 |
+------------+------+----------+----------+----------+