我在进行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中,因为当我看到它时,我意识到我不需要数据库中的值。
答案 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 |
+------------+------+----------+----------+----------+