Обновление значения из другой таблицы дорого на большом наборе данных - PullRequest
1 голос
/ 08 июля 2019

У меня есть таблица (table1) с 7 миллионами строк, и мне нужно скопировать одно значение из этой таблицы в столбец из другой таблицы (table2). Я попытался сделать это на примере таблицы только с 50 строками, и это было очень дорого (22 секунды). Я что-то пропустил? Это относительно простая операция, и я не могу запустить ее часами / днями.

postgres=# explain analyze update table2 set myvalue=(SELECT myvalue from table1 t1 where table2.id=t1.id);

ПЛАН ЗАПРОСА

 Update on table2  (cost=0.00..14291311.70 rows=130 width=586) (actual time=22074.702..22074.702 rows=0 loops=1)
   ->  Seq Scan on table2  (cost=0.00..14291311.70 rows=130 width=586) (actual time=407.754..22073.606 rows=50 loops=1)
         SubPlan 1
           ->  Seq Scan on table1 t1  (cost=0.00..109933.08 rows=4836 width=32) (actual time=264.664..441.460 rows=1 loops=50)
                 Filter: (table2.id = (id)::text)
                 Rows Removed by Filter: 737957
 Planning time: 0.110 ms
 Execution time: 22074.747 ms

Ответы [ 2 ]

1 голос
/ 08 июля 2019

ОБНОВЛЕНИЕ с объединением, которое обычно быстрее:

update table2 
  set myvalue = t1.myvalue
from table1 t1 
where table2.id=t1.id;
0 голосов
/ 08 июля 2019

Обновление всех строк будет дорогим. Однако для этого запроса:

update table2
    set myvalue = (SELECT myvalue from table1 t1 where table2.id = t1.id);

У вас много сканирования. Индекс поможет, особенно на table1(id, myvalue).

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