繁体   English   中英

没有锁定SQL Server 40,000+行的数据集更新

[英]Dataset Update without Locking SQL Server 40,000+ Rows

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

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

我无法访问SQL Server的服务器文件系统,因为它是一个共享环境,而且SQL Server的BULK COPY不可用。 由于我的文件大小,提供程序的批量复制方法无法按照公布的方式工作。 显然,这会更有效率。 我猜这是我的蓝领方式。 我每晚在2个进给中远程进行大约10万行的操作。每次花费大约45分钟。

我遇到的问题是这个绑定表已被锁定,因此在进行45分钟更新时无法进行任何查询或访问。 它再次起作用。 是否有参数或设置,我可以调用或设置允许在此更新期间使用它。

SQL Server中的UPDATE 总是必须采用独占锁定 - 没有办法/没有技巧/没有黑客攻击。

但是这个独占锁只是在正在更新的单行上 - 它将在事务完成后发布。

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

我在这里看到两个选项:

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

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

除非您通过非常慢的网络连接进行此插入,否则100K行实际上并不是SQL Server要处理的。 这听起来更像是长时间运行的事务的锁定问题。 我认为在插入所有行并导致大量阻塞问题后,您只进行一次提交。 如果这是一个包含大量读取的表,那么您将遇到锁定问题。 有关锁定升级的信息,请参阅marc_s的帖子。 您应该修改插入,以便更频繁地提交每100行。 四处游走,直到获得最佳数字。 您希望避免长时间运行的事务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM