2012-10-10 42 views
0

我有這個問題。我可以看到like的一些問題。使用LIKE比較優化存儲過程

你們可以看看這個查詢並幫我優化它嗎?我真的很感謝你花時間在這裏支持我。

UPDATE F_State 
    SET StateName = L.State_Name 
    FROM Reg.Location L 
    JOIN F_State S ON CONVERT(nvarchar, L.stateID) = s.StateCode --BECAUSE THIS IS NVARCHAR and ststeid isnt 
    WHERE S.StateName LIKE '%)%' 
    AND L.ZIPCODE = S.ZIPCODE 
    AND L.CITY=S.CITY 

我有大約300,000行更新....這根本沒有幫助。你們能幫我解決嗎?再次感謝你們!

+3

使用'LIKE'%....%''基本上可以防止SQL Server能夠使用任何索引。如果你真的需要這樣 - 關於運行時間你可以做的不多 - 你只需要耐心..... –

+0

@marc_s ....嘿,現在它已經將近半個小時了,還在運行......謝謝再次,夥計.. –

回答

0

如果你在oracle上,你可以在INSTR中使用基於函數的索引(insted LIKE'%)'),這將解決你的問題。

但您的情況LIKE'%..%'問題是不相關的。

  1. 您正在更新整個表格,是否真的有必要?
  2. 你真的必須再次加入F_State嗎?
  3. 你有索引(或唯一約束)的StateCode和ZipCode索引?

我看不到,你在做什麼,但我想你試圖設置F_State.StateName它包含'%)%'與Location.State_name。發現Appropriete位置的狀態ID與F_State中的StateCode相同(wtf,實際上?一個是nonvarchar ID,一個是varchar ...,但是okey)與同一個ZipCode和同一個城市相同。

UPDATE F_State S 
    SET S.StateName = (SELECT State_Name 
         FROM Reg.Location L 
         WHERE CONVERT(nvarchar, L.stateID) = s.StateCode 
         AND L.ZipCode = S.ZipCode 
         AND L.City = S.City 
         LIMIT 1) 
WHERE S.StateName LIKE '%)%';