0

我们有一个跨三个大表运行的索引视图。其中两个表 (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)更改现有视图以指向新表的更好方法?

谢谢!

4

3 回答 3

3

您遇到的问题是在三个表之间添加索引视图会导致锁争用。这里有一篇关于这个问题的非常好的帖子:http: //sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/02/be-ready-to-drop-your-indexed-view.aspx

对表进行分区可能会提供一些缓解,尽管我不知道分区是否会规避锁定问题。但是,如果您想研究此选项,则必须升级到 2008 - 因为您需要使用分区对齐的索引视图。2005 将要求您在换入/换出任何分区之前删除视图。

有关分区对齐索引视图的更多信息:http: //msdn.microsoft.com/en-us/library/dd171921.aspx

于 2010-03-01T15:05:03.610 回答
0

我们可以试试这个来避免锁定。

SELECT a,b,c FROM indexedview as v WITH (NOEXPAND,NOLOCK) WHERE ...
于 2014-03-04T09:01:12.553 回答
0

您是否考虑过让 C 成为分区表并换入/换出分区作为您的价格更新机制?我不确定这将如何与索引视图一起使用 - 我认为此时需要重建索引。实际上,我认为这可能与您在 ALTER TABLE 中看到的情况相同。

索引视图真的有必要吗?即,当使用普通视图时,3 个基础表上的适当索引是否也能表现得一样好?请记住,索引视图可能必须在三个表中任何一个的键更改时更新,而单个表上的索引仅在键更改或数据仅在该表中移动时才需要更新。通常,索引视图在与基表不同的列上建立索引,因为它是跨数据的不同类型的部分,而不是基础表中可用的部分 - 该描述真的适用吗?

定价更新需要多长时间?这似乎是您问题的核心,但如果没有更多信息,很难说。

于 2009-11-23T18:49:17.613 回答