1

我有一个从 tableA 读取数据并将数据插入 tableB 的包。这个包可以并行运行多次(通常是 3 到 5 次),但从不读取相同的数据。假设它在两个表上都有一个标志 customerID,因此包的每次执行都将从特定的 customerID 读取数据。

我意识到,如果我不在我的目的地使用 TABLELOCK,负载会发生得更快。我相信这是因为包的每次执行都同时在 tableB 上插入数据,即使在页面级别发生了一些锁定,整个表也没有被锁定。

所以我的问题是,在目的地不使用 TABLELOCK 有什么问题吗?

PS:我正在使用快速加载,customerId 是表 B 上的聚集索引。

4

1 回答 1

1

只要您的并行运行调用唯一的客户 ID,那么就不会,在性能方面或死锁方面没有真正的问题。

实际上,您至少应该注意两个问题:

1)您的并行任务插入数据的顺序,以及随后对tableB的读取。根据您从 tableB 读取的实时性,TABLOCK 将有助于确保(但仍不能保证 - 如果一个客户有 10,000 行而另一个只有 1 行,那么第二个客户可能会在数据流任务处理中“跨越”第一个客户)您的并行运行仍然按照它们执行的顺序进行处理。因此,您最终可能会遇到数据在您认为可用时不可用的情况,因此如果顺序很重要(我猜它不重要,或者您不应该并行运行),至少要意识到这一点。

2) 即使您没有启用 TABLOCK,如果插入足够大,它也可以自动从 ROWLOCK 跳转到 TABLOCK,因此您可能仍然会遇到一些工作的延迟和交错完成。

于 2013-01-22T15:46:30.140 回答