Выполнение оператора вставки с CTE - PullRequest
0 голосов
/ 19 марта 2020

У меня есть 2 внешних таблицы, давайте назовем их A и B. У меня также есть внутренняя таблица C. A и B имеют несколько перекрывающихся значений. Я хочу написать процедуру, которая записывает все значения от A до C, а затем все значения от B, которые я не делаю (от A) до C. Поэтому сначала запишите A в C, затем запишите все оставшиеся данные, которые еще не были записаны, из B в C. В основном это:

Write A -> C 
Write B where not already written by A -> C

Моя первая попытка выглядела следующим образом

insert into C (select * from A);
insert into C (select * from B where b.id not in (select a.id from a));

Мои таблицы довольно большие, и линии передачи данных работают медленно, поэтому это не сработает, потому что это занимает много времени. Я предполагаю, что проблема в том, что он должен делать (select a.id from a) для каждой записи B. Поэтому я подумал, что использование CTE наверняка поможет:

insert into C (select * from A);
insert into C 
  with A_values as (select a.id from a)
  select * from b where b.id not in a.values;

Однако, это все равно не прекратится (слишком долго ). Есть идеи, как я могу это исправить?

1 Ответ

2 голосов
/ 19 марта 2020

Я думаю, что вы описываете две вставки:

insert into c ( . . . )
    select . . .
    from a;

insert into c ( . . . )
    select . . .
    from b
    where not exists (select 1 from c where b.id = c.id);

Для производительности вам нужен индекс на c(id) - или любые другие столбцы, используемые для сравнения.

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