对索引视图执行大型更新

时间:2009-11-23 16:30:43

标签: sql-server large-data-volumes indexed-view

我们有一个跨三个大表的索引视图。其中两个表(A& B)不断更新用户事务,另一个表(C)包含需要每周更新一次的数据产品信息。此产品表包含超过600万条记录。

对于我们的核心业务流程,我们需要在这三个表中使用此视图,遗憾的是我们无法更改此方面。我们甚至有一个SQL Server MVP进来帮助测试负载,以确保我们有最有效的配置。产品表中有一列可在视图中使用,并且必须每周更新。

我们现在遇到的问题是,随着我们对表A和A的交易量的增加。 B,对表C的更新导致死锁。

我尝试了几种不同的方法无济于事: 1)我希望我们可以更改视图,以便表C可以是脏读“WITH(NOLOCK)”,但显然索引视图不能使用该功能。

2)我考虑更新表C中的新列,然后在完成该过程时重命名它,但由于视图中的依赖性而无法执行此操作。

3)我还想到了将这个值写入临时产品表,然后对视图运行ALTER语句以使其指向我的新表的想法。但是,当我这样做时,我的视图上的索引被删除了,重新创建它们需要相当多的时间。

4)我们尝试以小块(每次只有100条记录)进行每周更新,但我们仍然遇到死锁。

的问题:

a)我们正在使用sql server 2005. sql server 2008是否有一个新的功能,其索引视图可以帮助我们?现在有办法用索引视图进行脏读吗?

b)更好地改变现有视图以指向新表的方法吗?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我们可以尝试这样做以避免锁定。

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