我们有一个跨三个大表运行的索引视图。其中两个表 (A & B) 不断更新用户事务,另一个表 (C) 包含需要每周更新一次的数据产品信息。该产品表包含超过 600 万条记录。
对于我们的核心业务流程,我们需要跨这三个表的视图,不幸的是我们无法更改这方面。我们甚至有一个 sql server MVP 来帮助在负载下进行测试,以确保我们拥有最有效的配置。产品表中有一个列在视图中被使用,并且必须每周更新。
我们现在遇到的问题是,随着我们针对表 A 和 B 的事务量增加,对表 C 的更新导致死锁。
我尝试了几种不同的方法都无济于事:1)我希望我们可以更改视图,以便表 C 可能是脏读“WITH(NOLOCK)”,但显然该功能不适用于索引视图。
2) 我考虑过在表 C 中更新一个新列,然后在该过程完成后重命名它,但由于视图中的依赖性,您不能这样做。
3) 我还考虑将这个值写入临时产品表,然后针对视图运行 ALTER 语句以使其指向我的新表。然而,当我这样做时,我视图上的索引被删除了,重新创建它们需要相当多的时间。
4)我们尝试以小块(一次小至 100 条记录)进行每周更新,但我们仍然遇到死锁。
问题:
a) 我们使用的是 sql server 2005。sql server 2008 的索引视图是否具有对我们有帮助的新功能?现在有没有办法使用索引视图进行脏读?
b)更改现有视图以指向新表的更好方法?
谢谢!