Ускорьте ОБНОВЛЕНИЕ из другой таблицы - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующий код:

UPDATE tableOne
SET columnOne = CASE
                 WHEN tableOne.columnTwo LIKE '%-02-%' OR tableOne.columnTwo LIKE '%-03-%' OR
                      tableOne.columnTwo LIKE '%-04-%' OR
                      tableOne.columnTwo LIKE '%-05-%' OR
                      tableOne.columnTwo LIKE '%-06-%' OR
                      tableOne.columnTwo LIKE '%-07-%' OR tableOne.columnTwo LIKE '%-08-%' OR
                      tableOne.columnTwo LIKE '%-09-%'
                         THEN tableTwo.columnOne :: text
                 ELSE tableOne.columnOne
    END

FROM tableTwo
WHERE tableTwo.tableId = tableOne.tableId

У меня есть две таблицы. tableOne состоит из 100 миллионов строк (и 40 столбцов), а tableTwo состоит из 90 миллионов строк. Выше запрос уже выполняется в течение более 2 дней. Я не уверен, что это когда-нибудь закончится. Есть ли способ оптимизировать запрос?

Если полезно LIKE делает следующее: Проверяет, указан ли в строке (например, 2018-06-30 08:20:17) месяц. Если да, выберите значение из tableTwo (и CAST, чтобы набрать text), в противном случае оставьте значение self (уже наберите text).

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Переместите условие case в предложение where:

UPDATE tableOne
    SET columnOne = tableTwo.columnOne::text
FROM tableTwo
WHERE tableTwo.tableId = tableOne.tableId AND
      tableOne.columnTwo ~ '-0[2-9]-' and
      tableOne.columnOne is distinct from tableTwo.columnOne::text;

Регулярные выражения на самом деле не намного быстрее, чем куча лайков. Выигрыш здесь в том, что не обновляются строки, которые не нужно обновлять. Если формат tableOne.columnTwo является известным форматом, вы можете использовать вместо этого операции с подстрокой.

0 голосов
/ 29 октября 2018

Как насчет обновления, только если месяц находится между 02 и 09

UPDATE tableOne
SET columnOne = tableTwo.columnOne :: text
FROM tableTwo
WHERE tableTwo.tableId = tableOne.tableId 
  AND SUBSTRING(tableOne.columnTwo FROM 6 FOR 2) BETWEEN '02' AND '09'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...