У меня есть два запроса, вставить и обновить.Я провел тест через консоль postgres с большим набором данных и обнаружил, что postgres не собирает индекс.Чтобы решить эту проблему - я отключил seqscan для этих двух запросов и получил огромный прирост производительности;Postgres смог подобрать индексы для сканирования по таблице.
Проблема: я делаю то же самое с помощью jdbc
statement.executeUpdate("set enable_seqscan = off");
statement.executeUpdate("My_Insert_Query");
statement.executeUpdate("My_Update_Query");
statement.executeUpdate("set enable_seqscan = on");
Но похоже, что postgres не выключает seq_scan для изапросы выполняются слишком долго.
Мастер-таблица
Master_Id auto-generated
child_unique integer
Child Table
child_unique integer
Master_id integer
Insert into Master (child_unique) from Child as i WHERE NOT EXISTS ( SELECT * from Master where Master.child_unique = i.child_unique);
Update Child set Master_id = Master.Master_id from Master where Master.child_unique = Child.child_unique;
Для каждой уникальной строки в Child, которой нет в Master-файле, я вставляю ее в свою мастер-таблицу и получаюавтоматически генерирует Master_ID и вставляет его обратно в дочернюю таблицу.
Обе таблицы имеют индекс для child_unique.
Индекс выбирается в главной таблице, где в отличие от дочерней таблицы это не так.,Как я узнал?Использование таблицы pg_stat_all_indexes Postgres.