数据库视图性能问题

时间:2009-06-11 08:03:53

标签: sql-server database view locking

我正在使用SQL Server 2008,我有两个具有相同模式的表,我创建了一个视图,它将两个表的内容结合起来,为外部访问提供单个“表”视图。

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

我的问题是,如果另一个表是在批量插入/删除操作下,物理表是否会被锁定,以便外部用户对两个表的联合视图的访问也被阻止? (我在考虑锁定升级是否适用于此场景,行锁最终锁定表,最终锁定视图的访问权限?)

2 个答案:

答案 0 :(得分:2)

  

如果另一个表处于批量插入/删除操作下,物理表是否会被锁定,以便外部用户对两个表的联合视图的访问也被阻止?

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

如果您希望优化批量加载时间,请确保您已阅读this blog post

修改

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

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

答案 1 :(得分:2)

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

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

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

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

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

编辑:现在我喝咖啡了......

如果你需要在加载/删除操作期间查询批量表得到准确的结果没有遭受性能命中,我建议你需要考虑SNAPSHOT隔离

编辑2:SNAPSHOT isolation