我正在从FTP站点获取制表符分隔文件并进行夜间下载。然后我使用我的数据集将其上传到表单中。我只是将其加载到数据集中并绑定它。它有效,但是......
我有两个这样的文件,最初我有一个工作,只是通过手动将所有数据从文件中拉出文件来完成每行的插入。我假设在Visual Studio中绑定数据表或数据集2012年将使用更好的算法,我也认为它可能更容易,更有效。至少相对容易。
我无法访问SQL Server的服务器文件系统,因为它是一个共享环境,而且SQL Server的BULK COPY不可用。由于我的文件大小,提供程序的批量复制方法无法按照公布的方式工作。显然,这会更有效率。我猜这是我的蓝领方式。我每晚都会在2个饲料中远程进行大约10万行。每次花费大约45分钟。
我遇到的问题是此绑定表已被锁定,因此在更新45分钟后无法进行任何查询或访问。它再次起作用。是否有参数或设置,我可以调用或设置允许在此更新期间使用它。
答案 0 :(得分:9)
SQL Server中的UPDATE
将始终必须采取独占锁定 - 没有办法/没有技巧/没有黑客攻击。
但是这个独占锁只是在正在更新的单行上 - 它将在事务完成后发布。
但是:如果在单个事务中更新超过5000行,SQL Server会将行级别独占锁升级为表级锁 - 实质上是锁定整个表,直到事务完成。
我在这里看到两个选项:
如果您可以采用这种方法,则可以将导入分解为例如单个交易中的2000行;这样,您可以避免表级别的独占锁,并且您的系统在导入期间将保持更快的响应。缺点是:它可能需要更长的时间,你可能会导致一些行被导入,而其他行则失败 - 你不再为整个文件获得一个干净的“全部或全部”导入
您可以启用一些跟踪标志/开关来关闭此锁升级机制,因此您可以通过行级锁处理整个40000行的导入。另一方面,这给锁管理系统带来了很多压力和额外的工作,因此可能需要更多的时间和/或更多的RAM来处理所有这些独占锁,并且在导入期间运行的查询可能会变慢(如果是39999个人)必须检查专用锁)
答案 1 :(得分:0)
除非您通过非常慢的网络连接进行此插入,否则100K行实际上并不是SQL Server要处理的。这听起来更像是长时间运行的事务的锁定问题。我认为在插入所有行并导致大量阻塞问题后,您只进行一次提交。如果这是一个包含大量读取的表,那么您将遇到锁定问题。有关锁定升级的信息,请参阅marc_s的帖子。您应该修改插入,以便更频繁地提交每100行。四处游走,直到获得最佳数字。您希望避免长时间运行的事务。
不确定您运行的是哪个版本的SQL Server,但如果它是2005或更高版本,则可以为数据库启用快照隔离并将其用于此特定事务。这会给tempdb增加一点压力,但是你会得到一个MVCC风格的锁定机制,读者不会阻止编写器。有关详细信息,请参见此处http://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.80).aspx