2011-06-23 55 views
1

我已經嘗試在大約25k行的表上運行以下UPDATE,並且它已超過24小時運行並且尚未完成。我只需要運行這個UPDATE一次,所以時間不是太多的問題,但任何長期的只是不會爲我工作。 UPDATE語句可以正常工作,因爲我試圖在幾條記錄上單獨運行它,但是當您將其應用於整個表格時,它會陷入停滯狀態。使用LIKE優化SQL UPDATE

林肯定的是LIKE導致慢下來,但我沒有任何想法如何使這個任何簡單或更快,任何線索,將不勝感激:

UPDATE INVENTORY i2 

SET i2.BVRTLPRICE01 = 

(SELECT i1.BVRTLPRICE01 FROM INVENTORY i1 

WHERE 

i1.CODE = REPLACE(LEFT(i2.CODE,1), 'S', 'C') + SUBSTRING(i2.CODE,2,LENGTH(i2.CODE)))   

WHERE 

i2.CODE like 'S%' 
+0

您正在使用哪個RDBMS,以及哪個版本? – Yuck

+0

其稱爲PERVASIVE SQL v8.7 – seb

回答

0

我只和Pervasive一起工作過一次或兩次,但我無法想象引擎是如此可怕,以至於你的問題會變成簡單的LIKE。這個問題更可能是子查詢。

我反而試試這個:

UPDATE 
    I2 
SET 
    BVRTLPRICE01 = I1.BVRTLPRICE01 
FROM 
    INVENTORY I2 
INNER JOIN INVENTORY I1 ON 
    I1.CODE = REPLACE(LEFT(I2.CODE, 1), 'S', 'C') + 
       SUBSTRING(I2.CODE, 2, LENGTH(I2.CODE))) 
WHERE 
    I2.CODE LIKE 'S%' 

此外,請確保您只從I1加入一個行和I2中的每一行沒有得到多少行。

+0

非常感謝,這在幾秒鐘內執行! – seb

0

使用適當的加入子查詢,而不是

UPDATE INVENTORY i2 
SET i2.BVRTLPRICE01 = i1.BVRTLPRICE01 
FROM INVENTORY i1,INVENTORY i2 
WHERE i1.CODE = REPLACE(LEFT(i2.CODE,1), 'S', 'C') + SUBSTRING(i2.CODE,2,LENGTH(i2.CODE))) 
AND i2.CODE like 'S%' 
0

我有一個小的預感。可能是錯誤的,但基於瘋狂的運行時和小數據集。嘗試添加

LIMIT 1 

到您的子查詢。