我正在使用SQL Server 2008,我有两个具有相同模式的表,我创建了一个视图,它将两个表的内容结合起来,为外部访问提供单个“表”视图。
其中一个表是只读的,另一个表包含批量插入/删除操作(在另一个表中,我将在某个时间间隔使用批量插入来插入几千行并运行另一个SQL作业以删除几百万行每日)。
我的问题是,如果另一个表是在批量插入/删除操作下,物理表是否会被锁定,以便外部用户对两个表的联合视图的访问也被阻止? (我在考虑锁定升级是否适用于此场景,行锁最终锁定表,最终锁定视图的访问权限?)
答案 0 :(得分:2)
如果另一个表处于批量插入/删除操作下,物理表是否会被锁定,以便外部用户对两个表的联合视图的访问也被阻止?
是的,需要注意的是,如果优化器可以找到执行不涉及访问批量插入表的查询的方法,则不会阻止访问。
如果您希望优化批量加载时间,请确保您已阅读this blog post。
修改强>
您遇到的实际问题是什么?您是否真的需要在任何地方使用此视图(例如,是否只有需要来自一个表的数据,通过视图查询它?)
如果您希望查看“在线”,请始终考虑快照隔离,或者如果要将完整集装入批量表(例如,每天更换完整内容),则可以将数据加载到单独的表和sp_rename表(在一个事务中)
答案 1 :(得分:2)
很可能是的。这取决于锁定升级
要解决(不是所有选项):
使用WITH(NOLOCK)表提示忽略并且不设置任何锁。如果在视图上使用它也适用于两个表
如果您不介意在BCP表中跳过锁定的行,请使用WITH(READPAST)
更改BCP表的锁粒度。使用sp_tableoption并设置“批量加载时的表锁定”= false。
编辑:现在我喝咖啡了......
如果你需要在加载/删除操作期间查询批量表和得到准确的结果和没有遭受性能命中,我建议你需要考虑SNAPSHOT隔离