Я работаю над выполнением различий между таблицами в postgresql, это занимает много времени, так как каждая таблица ~ 13 ГБ ... Мой текущий запрос:
SELECT * FROM tableA EXCEPT SELECT * FROM tableB;
и
SELECT * FROM tableB EXCEPT SELECT * FROM tableA;
Когда я выполняю diff для двух (неиндексированных) таблиц, это занимает 1:40 часа (1 час и 40 минут). Чтобы получить как новые, так и удаленные строки, мне нужно выполнить запрос дважды, получив общее количествовремя до 3:30 часов.
Я запустил запрос Postgresql EXPLAIN, чтобы узнать, что он делает.Похоже, что он сортирует первую таблицу, затем вторую, а затем сравнивает их.Это заставило меня задуматься о том, что если бы я проиндексировал таблицы, они были бы предварительно отсортированы, и запрос diff был бы намного быстрее.
Индексирование каждой таблицы заняло 45 минут.После индексации каждый Diff занял 1:35 часа.Почему индексы сбрасывают только 5 минут от общего времени различий?Я бы предположил, что это будет больше половины, так как в неиндексированных запросах я сортирую каждую таблицу дважды (мне нужно выполнить запрос дважды)
Поскольку одна из этих таблиц не будет сильно меняться, она будетнужно только проиндексировать один раз, другой будет обновляться ежедневно.Таким образом, общее время выполнения для индексированного метода составляет 45 минут для индекса, плюс 2x 1:35 для разницы, что дает в общей сложности 3:55 часов, почти 4 часа.
Что я делаю здесь неправильно, яне могу понять, почему с индексом мое время различий в сети больше, чем без него?
Это небольшая ссылка на мой другой вопрос здесь: Postgresql UNION занимает в 10 раз больше времени, чем работает индивидуумзапросы
РЕДАКТИРОВАТЬ: Вот схема для двух таблиц, они идентичны, кроме имени таблицы.
CREATE TABLE bulk.blue
(
"partA" text NOT NULL,
"type" text NOT NULL,
"partB" text NOT NULL
)
WITH (
OIDS=FALSE
);