Повышение производительности запроса UPDATE WHERE sql - PullRequest
0 голосов
/ 14 ноября 2018

У меня довольно простой запрос

UPDATE TableA
SET date_type = TableB.date_type
FROM TableB
WHERE TableB.int_type = TableA.int_type

Мои индексы: TableA(int_type), TableB(int_type, date_type)

EXPLAIN Результаты:

Update on TableA  (cost=2788789.320..34222368.900 rows=82594592 width=261)
  ->  Hash Join  (cost=2788789.320..34222368.900 rows=82594592 width=261)
          Hash Cond: (TableA.int_type = TableB.int_type)
        ->  Seq Scan on tableA  (cost=0.000..12610586.960 rows=101433296 width=247)
        ->  Hash  (cost=1272403.920..1272403.920 rows=82594592 width=18)
              ->  Seq Scan on TableB  (cost=0.000..1272403.920 rows=82594592 width=18)

Запросвыполняется более 3 часов.

Что можно сделать, чтобы он работал быстрее?Как видно из результатов EXPLAIN, индексы не используются.Стоит ли выбирать другие индексы / делать какие-либо другие улучшения, чтобы запрос выполнялся быстрее?

Postgresql 9.6

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Что вы могли бы сделать, так это избежать идемпотентных обновлений:


UPDATE TableA a
SET date_type = b.date_type
FROM TableB b
WHERE b.int_type = a.int_type
AND a.date_type IS DISTINCT FROM b.date_type  -- <<-- avoid updates with the same value
        ;

И, возможно, вы предполагаете отношение 1 к 1 между А и В, но СУБД не,Вы можете ограничить обновления не более чем одной исходной строкой на целевую строку:


EXPLAIN
UPDATE TableA a
SET date_type = b.date_type
FROM ( SELECT int_type, date_type
        , row_number() OVER(PARTITION BY int_type) AS rn
        FROM TableB
        ) b
WHERE b.int_type = a.int_type
AND a.date_type IS DISTINCT FROM b.date_type -- <<-- avoid idempotent updates
AND b.rn=1 -- <<-- allow only one update per target row.
        ;
0 голосов
/ 14 ноября 2018

Для этого запроса:

UPDATE TableA
SET date_type = TableB.date_type
FROM TableB
WHERE TableB.int_type = TableA.int_type

Вы можете попробовать индекс на TableB(int_type, date_type).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...