2009-11-23 31 views
0

我們有一個建立在三個大型表上的索引視圖。其中兩個表(A & B)不斷更新用戶事務,另一個表(C)包含需要每週更新一次的數據產品信息。該產品表包含超過600萬條記錄。對索引視圖執行大型更新

對於我們的核心業務流程,我們需要在這三個表中使用此視圖,但不幸的是,我們無法更改此方面。我們甚至有一個sql server MVP來幫助在負載下進行測試,以確保我們擁有最高效的配置。產品表中有一列在視圖中使用,並且必須每週更新一次。

我們現在遇到的問題是,隨着交易量增加,我們的交易對照表A & B,表C的更新導致死鎖。

我已經嘗試了幾種不同的方法無濟於事: 1)我希望我們可以改變視圖,以便表C可以是一個髒讀「WITH(NOLOCK)」,但顯然該功能不適用於索引觀點。

2)我想過更新表C中的新列,然後在完成過程時重命名它,但由於視圖中的依賴關係而無法完成此操作。

3)我也樂於將這個值寫入臨時產品表,然後對該視圖運行ALTER語句以使其指向我的新表。但是,當我這樣做時,我的觀點中的索引被刪除,重新創建它們花費了相當多的時間。 4)我們試圖每小時進行一次更新(一次只能處理100條記錄),但是我們仍然遇到了死鎖。

問題:

一),我們使用的是SQL Server 2005的SQL Server 2008中是否有他們的索引視圖的新功能,將幫助我們?現在有一種方法可以執行帶有索引視圖的髒讀操作嗎?

b)改變現有視圖以指向新表的更好方法?

謝謝!

回答

0

您是否考慮過將C作爲分區表,並將分區換入/分出作爲您的價格更新機制?我不確定這是如何處理索引視圖 - 我認爲索引需要在那時重建。我認爲這實際上可能與您使用ALTER TABLE看到的情況相同。

索引視圖是否真的有必要?即當使用普通視圖時,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

0

我們可以試試這個爲避免鎖定。

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