批量插入块nolock查询

时间:2012-12-13 13:43:49

标签: sql-server locking bulkinsert

我有一个SSIS包,它正在截断,然后将整个表从serverA插入到serverB,但是我试图通过在serverB上执行带有NOLOCK提示的select来查看作业的进度但是它被“ BULK INSERT“由SSIS包执行。

我查看了“sys.dm_tran_locks”并发现“BULK INSERT”在桌面上持有“Sch-M”锁,我不明白为什么。

请你帮帮我吗?

感谢。

2 个答案:

答案 0 :(得分:2)

Sch-M锁表示目标表上至少有一个索引。

请参阅“批量导入期间的表锁定和记录”:

http://msdn.microsoft.com/en-us/library/ms177445%28v=sql.105%29.aspx

根据参考文献中的表格,当您批量插入时,将使用Sch-M:

  1. 使用具有一个非聚集索引和tablock的堆
  2. 使用空B-Tree(聚集索引)和tablock
  3. 此外,如果正确完成加载,则在批量插入开始之前,将完成截断(并且它的Sch-M锁定已经消失)。

    批量更新(BU)锁定是最佳锁定,但不希望在批量插入期间读取表格:

    批量更新(BU)锁允许进程将数据并发批量复制到同一个表中,同时阻止非批量复制数据的其他进程访问表 { {3}}

    使用Remus建议(sys.allocation_units)检查进度。

答案 1 :(得分:1)

截断需要SCH-M来解除分配表allocation units。除此之外,此锁用于防止并发脏读的目的。如果截断成功释放表而脏读取扫描程序在其中那些扫描程序会突然发现自己正在读取属于任何人的页面(或者更糟糕的是,被重新分配给其他AU)。与任何写锁定一样,2PL协议需要保持到事务结束。随后的脏扫描仪会阻挡它,因为它们应该。

如果你没有在一个事务中包含TRUNCATE / BULK INSERT,那么还有其他一些场景可能会导致BULK INSERT本身转到SCH-M而不是X(我认为在空表上批量插入表锁定提示(没有AU根页面会导致这个)。

查看BULK INSERT的进度,检查sys.allocation_units中为目标分配了多少页面。这将为您提供完整百分比的粗略估计。