оптимизация SQL UPDATE с помощью LIKE - PullRequest
1 голос
/ 23 июня 2011

Я попытался запустить следующее ОБНОВЛЕНИЕ для таблицы с приблизительно 25k строк, и она работала в течение более 24 часов, и она не завершена. Мне нужно только запустить это ОБНОВЛЕНИЕ один раз, чтобы время не было слишком большой проблемой, но все, что долго, просто не будет работать для меня. Оператор 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 голосов
/ 23 июня 2011

У меня есть небольшая догадка.может быть не так, но на основе сумасшедшего времени выполнения и небольшого набора данных.попробуйте добавить

LIMIT 1

к вашему подзапросу.

0 голосов
/ 23 июня 2011

Я работал с 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 голосов
/ 23 июня 2011

использовать правильное объединение вместо подзапроса

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%'
...