sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:la mejor manera de unir pequeños subconjuntos de tablas grandes

Como mencionaste, la única forma de verdaderamente saber es comparar los planes de ejecución. De hecho, la mejor manera sería usar EXPLAIN ANALYZE , para que realmente ejecute la consulta e inserte los resultados en la salida con las estimaciones, para que pueda tener una idea del planificador de consultas frente a la realidad.

Sin embargo, en general, lo que haría en una situación como esta probablemente sería crear una tabla temporal para el subconjunto de clientes y luego JOIN que a los orders mesa. Opcionalmente, podría usar WITH en lugar de hacer todo en una sola consulta.

Entonces, algo como:

CREATE TEMP TABLE tmp_clients AS
SELECT c.clientid
FROM clients c
WHERE c.city = 'New York'
ORDER BY c.clientid;

SELECT *
FROM orders AS o
JOIN tmp_clients AS c ON (o.clientid = c.clientid)
ORDER BY o.clientid;

De esta forma, tmp_clients contiene solo los clientes de Nueva York -- ~5K filas -- y es esa tabla la que se unirá a la tabla de pedidos.

También podría, para optimizar aún más, crear un índice en la tabla temporal (en el ID de cliente) y luego ANALYZE antes de hacer JOIN para garantizar que JOIN se realice únicamente en el índice. Le gustaría verificar los planes de consulta en cada caso para ver la diferencia relativa (o simplemente tenga esto en cuenta si JOIN no es tan rápido como te gustaría).

Respuesta al comentario de @poshest:

Eso suena como las tablas temporales se están acumulando, lo que aumentaría el consumo de memoria y, para una conexión de larga duración, la funcionalidad parece ser una fuga de memoria.

Sin embargo, en ese caso, no sería una verdadera filtración, ya que las tablas temporales están en el ámbito de una conexión. Desaparecen automáticamente, pero no hasta que finaliza la conexión. Sin embargo, puede hacer que desaparezcan de inmediato cuando haya terminado con ellos. Simplemente DROP la tabla como lo haría con cualquier otra una vez que haya terminado con ellos, y sospecho que podrá llamar a la función un montón de veces, en la misma conexión, sin el mismo tipo de aumento de huella de memoria monótona.