9

作为整体性能项目的一部分,我正在尝试加快事实表加载。该表只有大约 1.2 亿行,每天晚上添加大约 100k。该表的索引非常多。

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

我发现一个普通的旧 T-SQL 插入会比 SSIS 快速加载更快,这很奇怪,所以我开始查看在 OLEDB 目标上选中了哪些框。事实证明没有检查表锁。当我选中此选项时,SSIS 负载现在不到 1 分钟。我的问题是:

  • 选中 Table Lock 有什么影响?
  • T-SQL insert 语句是否默认发出表锁,这就是它最初更快的原因?
4

1 回答 1

10

好吧,我认为解释很简单(请参阅此处更详细的参考资料):

对于你的第一个问题:

表锁定- 默认情况下会检查此设置,建议检查它,除非其他进程同时使用同一个表。它指定将在目标表上获取表锁,而不是获取多个行级锁,这可能会导致锁升级问题。

至于insert语句,考虑到需要插入的行数比较多,那么SQL Server很可能会选择做表锁。

sys.dm_tran_locks要确认这一点,您可以使用DMV检查桌子上持有什么样的锁。以下是一些关于如何解释结果的好示例(以及关于锁升级的好读物):http ://aboutsqlserver.com/2012/01/11/locking-in-microsoft-sql-server-part-12-lock -升级/

于 2013-05-20T17:21:12.877 回答