【问题标题】:Dataset Update without Locking SQL Server 40,000+ Rows不锁定 SQL Server 40,000+ 行的数据集更新
【发布时间】:2013-07-28 03:57:51
【问题描述】:

我正在从一个 FTP 站点获取一个制表符分隔的文件并进行夜间下载。然后我使用我的数据集以它的形式上传它。我只是将它加载到数据集中并绑定它。它有效,但是...

我有 2 个这样的文件,最初我有一个正在工作,只是通过手动将所有数据从文件中拉出(如 VB 6)来插入每一行。我假设在 Visual Studio 中绑定了数据表或数据集2012 会使用更好的算法,我也认为它可能更容易和更有效。至少相对容易。

我无权访问 SQL Server 的服务器文件系统,因为它是一个共享环境,无法批量复制到 SQL Server。由于我的文件大小,提供商的批量复制方法也不能像宣传的那样工作。显然,这会更有效率。我想这是我的蓝领方式。我每晚对 2 个提要中的大约 100k 行进行远程处理,每次都需要大约 45 分钟。

我遇到的问题是此绑定上的表已被锁定,因此在 45 分钟的更新期间无法进行任何查询或访问。同样,它确实有效。是否有参数或设置,我可以调用或设置以允许它在此更新期间使用。

【问题讨论】:

  • 您是否考虑过导入另一个表,然后使用 SQL 移动它,甚至换出表?这会将您的行锁定限制在它在内部移动日期时,这对于那几行来说应该非常快。
  • 由于我不拥有该数据库,因此批量导入已完成,这确实可以轻松地将数据按摩到导入文件并将其发送出去。我正在使用更新语句,并在一种情况下提交要更新的表,这会锁定表直到完成@siva

标签: sql-server datatable dataset bind


【解决方案1】:

100K 行对于 SQL Server 来说并不能处理那么多,除非您在非常慢的网络连接上执行此插入操作。这听起来更像是一个长时间运行的事务的锁定问题。我认为在插入所有行并导致很多阻塞问题之后,您只进行一次提交。如果这是一个有很多读取的表,那么您将遇到锁定问题。有关锁升级的信息,请参阅 marc_s 的帖子。您应该修改您的插入,以便您更频繁地提交,例如每 100 行。玩弄这个值,直到你得到一个最佳数字。您希望避免长时间运行的事务。

不确定您运行的是哪个版本的 SQL Server,但如果是 2005 或更高版本,您可以为数据库启用快照隔离并将其用于此特定事务。这会给 tempdb 增加一点压力,但是您会得到一个 MVCC 风格的锁定机制,读者不会阻止作者。有关更多详细信息,请参见此处。 http://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.80).aspx

【讨论】:

  • 由于我不拥有该数据库,因此批量导入已完成,这确实可以轻松地将数据按摩到导入文件并将其发送出去。我正在使用更新语句,并在一种情况下提交要更新的表,这会锁定表直到完成。 @大卫
  • msdn 的链接已过时
【解决方案2】:

SQL Server 中的UPDATE总是 必须使用排他锁 - 没有办法/没有技巧/没有破解这个问题。

但是这个排他锁只是在被更新的单行上——它会在事务完成后被释放。

但是:如果您在单个事务中更新超过 5000 行,SQL Server 会将行级排他锁升级为表级锁 - 实质上是锁定整个表,直到事务完成。

我在这里看到两个选项:

  • 如果你能接受这种方法,你可以将你的导入分解成块,例如单个事务中的 2000 行;这样,您可以避免表级排他锁,并且您的系统在导入期间将保持更快的响应。缺点是:它可能需要更长的时间,并且您最终可能会导入一些行组,而其他行会失败 - 您不再为整个文件获得干净的“全有或全无”导入

  • 您可以启用一些跟踪标志/开关来关闭此锁升级机制,因此您的 40000 行的整个导入将由行级锁处理。另一方面,这会给锁管理系统带来很大压力和额外工作,因此可能需要更多时间和/或更多 RAM 来处理所有这些独占锁,并且在导入期间运行的查询可能会减慢(如果 39999 个人必须检查排他锁)

【讨论】:

  • 大家感谢您的回答。不幸的是,我正在使用运行 2008 的在线 SQL Server 和内部 VB.NET 来更新记录。由于我不拥有数据库,因此批量导入已完成,这确实可以轻松地将数据按摩到导入文件并将其发送出去。我正在使用更新语句,并在一种情况下提交要更新的表,正如 Marc 所说,它会锁定表直到完成。我们很小,这在凌晨 2-3 点工作,所以我们现在可以忍受它。如果我们能够解决 VPN 路由器问题,我们希望 MS Azure 能提供答案。 @马克
  • 小批量更新表的例子见stackoverflow.com/questions/41836140/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2022-01-11
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多