1

我正在使用 SQL Server 2008,并且我有两个具有相同架构的表,并且我创建了一个视图,该视图将两个表的内容结合起来,以向外部访问提供“表”的单个视图。

其中一个表是只读的,另一个表包含批量插入/删除操作(在另一张表上,我将每隔一段时间使用批量插入插入每千行并运行另一个 SQL 作业以每天删除几百万行)。

我的问题是,如果另一个表在批量插入/删除操作,物理表是否会被锁定,从而外部用户对两个表的联合视图的访问也被阻止?(我在想这个场景是否应用锁升级,行锁最终锁住了表,最终锁住了视图的访问?)

4

2 回答 2

2

如果另一张表在进行批量插入/删除操作,是否会锁定物理表,从而使外部用户对两个表的联合视图的访问也被阻止?

是的,需要注意的是,如果优化器可以找到一种方法来执行不涉及访问批量插入表的查询,那么访问将不会被阻止。

如果您希望优化批量加载时间,请确保您已阅读此博客文章

编辑

您遇到的实际问题是什么?你真的需要在任何地方都使用这个视图吗(例如,是否有地方只需要一个表中的数据,通过视图查询它?)

如果您希望始终查看“在线”,请考虑快照隔离,或者如果您将完整集加载​​到批量表中(例如,每天替换全部内容),您可以将数据加载到单独的表中并sp_rename 中的表(在事务中)

于 2009-06-11T08:10:33.240 回答
2

很可能是的。这取决于锁升级

要解决(不是所有选项):

  • 使用 WITH (NOLOCK) 表提示忽略并且不设置任何锁。如果在视图上使用它也适用于两个表

  • 如果您不介意跳过 BCP 表中的锁定行,请使用 WITH (READPAST)

  • 更改 BCP 表的锁定粒度。使用sp_tableoption并设置“大容量加载时的表锁定”= false。

编辑:现在我已经喝过咖啡了...

如果您需要在加载/删除操作期间查询批量表获得准确的结果并且不会遭受性能损失,我建议您需要考虑 SNAPSHOT 隔离

编辑 2:快照隔离

于 2009-06-11T08:12:46.670 回答