Как я могу запустить внешнее соединение для двух больших таблиц postgreSQL в пакетном режиме? - PullRequest
3 голосов
/ 17 июня 2020

У меня есть две таблицы с миллионами строк. У них общий адрес электронной почты. У них нет общих полей.

У меня есть операция соединения, которая работает нормально.

select r.*,l.* from righttable r full outer join lefttable l on r.email=l.email 

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

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

1 Ответ

1 голос
/ 17 июня 2020

Я не думаю, что вы можете делать это партиями, потому что он не будет знать, какие строки изготовить для выполнения «FULL OUTER», не увидев всех данных. Возможно, вы сможете обойти это, если знаете, что никто не вносит изменения в таблицы, пока вы работаете, путем выбора кортежей только для левых, только для правых и внутренних кортежей в отдельных запросах.

Но он не должен занимать всю вашу память (при условии, что вы имеете в виду ОЗУ, а не дисковое пространство) на сервере, потому что он должен использовать временные файлы вместо ОЗУ для основной части необходимого хранилища (хотя есть некоторые проблемы с использованием памяти для огромных ha sh присоединяется, поэтому вы можете попробовать set enable_hashjoin=off).

Клиент может использовать слишком много памяти, так как он может попытаться прочитать весь набор результатов сразу в ОЗУ клиента. Есть способы обойти это, но они, вероятно, не связаны с манипулированием самим JOIN. Вы можете использовать курсор для пакетного чтения из одного потока результатов, или вы можете просто записать результаты на диск с помощью \ copy, а затем использовать что-то вроде GNU split на нем.

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