4

我在做 BULK 插入时遇到了可怕的问题。我实际上使用 SqlBulkCopy 将许多行插入到表中。起初,我会得到一个超时异常。因此,我将 SqlBulkCopy 的 BulkCopyTimeout 设置为荒谬的 [?] 1800 秒。(还)不会抛出异常。因此,我从 MS Server 管理工作室检查了活动监视器(如此处建议:超时已过期。在操作完成之前超时时间已过或服务器没有响应。语句已终止)并看到我的 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

我忘了写我实际上是在使用实体框架,所以我复制了一个代码(实际上是从 c# 转换为 vb),它会从实体对象创建一个 DataTable,因为 EntityDataReader 仅适用于 C#(这让我很苦恼)。但不管怎么说。我丢弃了 SqlBulkCopy 的东西,只是将值存储在 XML 中,因为当我查看它时,我意识到我不需要数据库中的值。

4

1 回答 1

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 |
+------------+------+----------+----------+----------+
于 2020-09-16T11:50:35.013 回答