2009-06-11 102 views
1

我正在使用SQL Server 2008,并且我有两个具有相同模式的表,我创建了一个视图,该视图将两个表的内容联合起来以向外部访问提供“表”的单个视图。数据库视图性能问题

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

我的问题是,如果其他表在大容量插入/删除操作下,物理表是否被锁定,以便外部用户对两个表的联合视图的访问也被阻止? (我想到的锁升级是否适用于这种情况下,行锁终于锁定表,并最终锁定了视图的访问?)

回答

2

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

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

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

编辑

什么是您所遇到的实际问题?你是否真的需要在任何地方使用这个视图(例如,哪里只需要一张桌子上的数据,通过视图来查询它?)

如果你希望你一直以为“在线”考虑任一快照隔离,或者如果加载了全套成批量表(例如,全部内容每天更换),则可以将数据装载到一个单独的表,并sp_rename在该表(在事务)

+0

对不起,我的措辞令人困惑。我的意思是我有两个操作,其他表(1)批量插入(2)每天删除数百万行(不批量删除和批量插入)。我认为,即使(1)批量插入查询优化器可以找到方法来优化,为(2)删除操作,表将被锁定(发生锁定升级?)和查询视图将被锁定? – George2 2009-06-11 09:22:15

+0

@ sambo99,进一步quesiton,我看了你仔细提到的文件,我感到困惑的是什么与聚簇索引堆表与表之间的差异? – George2 2009-06-11 14:19:58

2

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

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

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

  • 使用带(READPAST),如果你不介意在BCP表

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

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

如果需要加载过程中查询批量表/删除操作得到准确的结果没有遇到性能命中,我建议你需要考虑快照隔离

编辑2:SNAPSHOT isolation