Tengo dos tablas con millones de filas. Comparten una dirección de correo electrónico común. No comparten ningún otro campo.
Tengo una operación de unión que funciona bien.
select r.*,l.* from righttable r full outer join lefttable l on r.email=l.emailSin embargo, el conjunto de resultados contiene millones de filas, lo que abruma la memoria de mi servidor. ¿Cómo puedo ejecutar consultas consecutivas que solo obtengan un número limitado de filas de cada tabla a la vez y, en última instancia, visiten todas las filas de las dos tablas?
Además, después de recibir un conjunto de resultados, nuestro servidor puede realizar algunas inserciones en una o ambas tablas. Me temo que esto puede complicar el seguimiento del desplazamiento en cada consulta consecutiva. Tal vez no sea un problema. No puedo envolver mi cabeza alrededor de eso.
No creo que pueda hacer esto en lotes, porque no sabrá qué filas fabricar para cumplir con el "EXTERIOR COMPLETO" sin ver todos los datos. Es posible que pueda evitarlo si sabe que nadie está realizando cambios en las tablas mientras trabaja, seleccionando las tuplas solo a la izquierda, las tuplas solo a la derecha y las tuplas internas en consultas separadas.
Pero no debería consumir toda su memoria (suponiendo que se refiera a la RAM, no al espacio en disco) en el servidor, ya que debería usar archivos temporales en lugar de RAM para la mayor parte del almacenamiento necesario (aunque hay algunos problemas con el uso de la memoria para grandes uniones hash, por lo que puede intentar set enable_hashjoin=off ).
El cliente podría usar demasiada memoria, ya que podría intentar leer todo el conjunto de resultados en la RAM del cliente a la vez. Hay formas de evitar esto, pero probablemente no impliquen manipular el JOIN en sí. Puede usar un cursor para leer en lotes desde un único flujo de resultados, o simplemente puede enviar los resultados al disco usando \copy, y luego split en algo como GNU.