У меня есть данные за 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
Так что результаты меня полностью смущают.
Как я уже сказал, любой, у кого есть опыт, мог бы действительно помочь мне понять.