gpt4 book ai didi

sql - 使用等待类型 LCK_M_RIn_LN 暂停批量插入

转载 作者:行者123 更新时间:2023-12-02 09:47:24 26 4
gpt4 key购买 nike

我在做大容量插入时遇到了可怕的问题。我实际上是在使用 SqlBulkCopy 将多行插入到一个表中。起初,我会得到一个超时异常。因此,我将 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 的这个定义:

Occurs when a task is waiting to acquire a NULL lock on the current key value, and an Insert Range lock between the current and previous key. A NULL lock on the key is an instant release lock. For a lock compatibility matrix, see sys.dm_tran_locks (Transact-SQL).



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

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

编辑

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

编辑 2

我不知道发生了什么,但是当我在管理工作室(使用直接 transact-sql)测试它时,批量插入工作正常。我不知道。也许它与 SqlBulkCopy 有关。当我检查事件监视器时,它生成的查询是这样的:
insert bulk TableName ([ColumnName] Int)
编辑 3

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

最佳答案

我在尝试从 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 |
+-----------+-------+-------------+---------+--------+----------------+--------------------------------------+
很难说确切的问题是什么,我观察到了一些事情:
  • 要么是驱动程序吞下了错误,要么只有在复制完成时才会得到它们,例如当我尝试插入一行时,我抛出了异常,其中包含需要修复的错误。
  • 调整很重要,特别是批量大小(见 https://dba.stackexchange.com/questions/165966/how-does-one-investigate-the-performance-of-a-bulk-insert-statement)

  • 一旦我解决了这些问题,那么满负荷就会按预期工作。
    我生成的批量大小/行的一些统计数据(注意数据正在跨越大西洋),但关键是性能变化很大。
    +------------+------+----------+----------+----------+
    | 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 |
    +------------+------+----------+----------+----------+

    关于sql - 使用等待类型 LCK_M_RIn_LN 暂停批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17856948/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com