【发布时间】:2010-12-19 13:11:27
【问题描述】:
我们有一个跨三个大表运行的索引视图。其中两个表 (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) 更改现有视图以指向新表的更好方法?
谢谢!
【问题讨论】:
标签: sql-server large-data-volumes indexed-view