使用具有快速加载目标的表锁选项会产生什么后果?

时间:2013-05-20 16:49:37

标签: sql-server-2008 ssis

我正在尝试加速事实表加载,作为整体性能项目的一部分。该表仅约1.2亿行,每晚约10万。该表非常重要。

目前我正在使用SSIS快速加载OLE DB目标,加载100,000行大约需要15分钟。对于我来说,插入100k行似乎非常高,因此我更改了包以将其结果转储到临时表中,然后从该临时表中将T-SQL插入到事实表中。插入件现在运行不到1分钟。

我发现很简单,一个普通的旧T-SQL插件比SSIS Fast Load快,所以我开始查看在OLEDB目的地上检查了哪些盒子。事实证明没有检查表锁。当我选中此选项时,SSIS负载现在不到1分钟。 我的问题是:

  • 选中Table Lock会有什么影响?
  • 默认情况下,T-SQL insert语句是否会发出表锁定,这是为什么它最初更快?

1 个答案:

答案 0 :(得分:9)

嗯,我认为解释很简单(参见更详细的参考here):

关于你的第一个问题:

  

表格锁定 - 默认情况下会检查此设置并提供建议   是否要检查它,除非某些人使用相同的表   其他过程同时进行。它指定将获取表锁   在目标表上而不是获取多行级别   锁,这可能会导致锁升级问题。

至于insert语句,考虑到需要插入相当多的行,SQL Server很可能会选择进行表锁定。

要确认这一点,您可以使用sys.dm_tran_locks DMV检查桌面上的锁类型。以下是关于如何解释结果的几个很好的示例(以及关于锁升级的良好读数):http://aboutsqlserver.com/2012/01/11/locking-in-microsoft-sql-server-part-12-lock-escalation/