2011-09-30 71 views
0

我嘗試提高其更新表中的每一行coloumn,通過在同一個表中的所有其他行比較實際行的值的查詢性能。以下是查詢:長時間運行的查詢連接表

update F set 
    PartOfPairRC = 1 
from RangeChange F 
where  Reject=0 
and exists( 
      select 1 from RangeChange S 
      where F.StoreID = S.StoreID 
      and F.ItemNo = S.ItemNo 
      and  F.Reject = S.Reject 
      and F.ChangeDateEnd = S.ChangeDate - 1) 

查詢的性能隨着表中行數的增加而迅速下降。我在桌上有50毫米的排。

有沒有更好的方法來做到這一點? SSIS能夠更好地處理這樣的操作嗎?

任何幫助非常感謝,謝謝羅伯特

回答

1

你可以嘗試創建該表上的索引:

create index idx_test on RangeChange(StoreID, ItemNo, Reject, ChangeDateEnd) where reject = 0 

- 當你不使用SQL企業擺脫地方條件索引並將拒絕列作爲包含列在索引 中 - 確保您的表上已經有聚簇索引(當您不能將上面的索引創建爲聚簇時)

- 我會寫查詢作爲連接:

update F set 
    F.PartOfPairRC = 1 
from RangeChange F 
    join RangeChange S 
     on F.StoreID = S.StoreID 
     and F.ItemNo = S.ItemNo 
     and F.Reject = S.Reject 
     and F.ChangeDateEnd = S.ChangeDate - 1 
where F.Reject=0 and S.Reject = 0 
+0

你的風險更多的寫作到數據庫的方式。 –

+0

謝謝,米哈爾。 –

+0

謝謝,米哈爾。原始代碼(我只是在審查)確實包括一個創建索引:創建聚簇索引IXC_RangeChange \t RangeChange(StoreID,ItemNo,ChangeDate) 這不包括拒絕,並且,如果ChangeDateEnd包含在索引中以及?非聚集索引在這裏更好嗎?它是否使用Join有重大意義,而不僅僅是Where子句?非常感謝,羅伯特 –