2015-08-14 101 views
1

我有兩個表:優化緩慢更新查詢

1)Testone - 具有100K行和1個索引和6非聚集索引

2)Testtwo - 具有316萬行,1指數和4非聚集索引

我有update語句需要優化下列一個因執行該查詢時,花更多的時間,你可以請幫我,最好的辦法..

update mp 
set mp.ModelInfoID = mi.ModelInfoID 
from Testone mp 
inner join Testtwo mi on mp.ModelNumberStr = replace(replace(mi.Model, '/', ''), '-', '') 
where MemberID is not null and mp.ModelInfoID is null 
+3

使用替換(或任何其他)函數的連接將執行可怕!您需要將您的表格加入到一個共同的索引列中。如果沒有一個,那麼你的查詢將無法在數百萬行中表現良好。 – beercohol

+3

也許添加一個[計算列](https://msdn.microsoft.com/en-us/library/ms188300.aspx)到testtwo而不是內聯替換(替換。然後計算列可用於索引產生可觀的結果 – xQbert

回答

0

啓動僅需查詢計劃優化這個

指數MEMBERID,mp.ModelInfoID和mi.ModelInfoID將有助於

select mp.ModelInfoID, mi.ModelInfoID 
    from Testone mp 
    join Testtwo mi 
    on mp.ModelNumberStr = replace(replace(mi.Model, '/', ''), '-', '') 
    and MemberID is not null 
    and mp.ModelInfoID is null 
    and mi.ModelInfoID is not null -- no need to update if they are the same 

克利裏替換(更換(mi.Model「 /',''),' - ','')將成爲瓶頸。一個帶有索引的計算列可能會做到這一點。