Почему это материализованное представление обновления намного медленнее, чем вставка в запрос select *? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть данные за 5 лет, которые добавляются ежедневно. Там около 15 миллионов строк данных, и в настоящее время мы добавляем несколько тысяч в день.

Для одного бита конвейера обработки, который является узким местом, я подумываю заменить материализованное представление таблицей, к которой я могу добавлять ежедневные дельты. Пытаясь оценить исходные показатели, я наткнулся на аномалию, которую не могу понять.

Кажется, что обновление материализованного представления, которое определяется простым оператором выбора, на куча быстрее, чем вставка в таблицу с эквивалентным оператором выбора. У меня закончились гипотезы. Буду рад любым предложениям!

У меня есть следующее

create table rpb.question_parts
(
    id bigserial primary key,
    question_id bigint not null,
    constraint question_parts foreign key (question_id) references rpb.questions(id) on delete cascade on update cascade
);

create materialized view rpb.question_parts_mv as select * from rpb.question_parts with data;

create table rpb.question_parts_copy
(
    id bigint,
    question_id bigint
); --note that there's no constraints, so no checking

Заполнив базовую таблицу (question_parts) примерно 5 миллионами строк, я делаю следующее ...

refresh materialized view rpb.question_parts_mv; 
-- takes about 2.8 seconds

и

insert into rpb.question_parts_copy select * from rpb.question_parts;
-- takes about 9 seconds
-- if there are any constraints (even deferred ones) it takes about 100 seconds
-- if I drop and add constraints (e.g. pkey) then adding them takes only 3 seconds

Так что результаты меня полностью смущают.

Как я уже сказал, любой, у кого есть опыт, мог бы действительно помочь мне понять.

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