【问题标题】:Doing large updates against indexed view对索引视图进行大量更新
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您遇到的问题是在三个表之间添加索引视图会导致锁争用。这里有一篇关于这个问题的非常好的帖子: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

      【讨论】:

        【解决方案3】:

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

        SELECT a,b,c FROM indexedview as v WITH (NOEXPAND,NOLOCK) WHERE ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-01
          • 1970-01-01
          • 2014-06-24
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多