使用LIKE优化SQL UPDATE

时间:2011-06-23 16:32:01

标签: sql pervasive

我尝试在一个大约有25k行的表上运行以下UPDATE,并且它已运行超过24小时且尚未完成。我只需要运行一次UPDATE,所以时间不是太大的问题,但任何长期的东西都不适合我。 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%'

3 个答案:

答案 0 :(得分: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%'

答案 1 :(得分:0)

我有一个小小的预感。可能是错的,但基于疯狂的运行时和小数据集。尝试添加

LIMIT 1

到您的子查询。

答案 2 :(得分: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中的每一行都有很多行。