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

Explique la sugerencia de rendimiento de la condición JOIN vs. LEFT JOIN y WHERE con más detalle

Efectivamente, WHERE condiciones y JOIN condiciones para [INNER] JOIN son 100 % equivalentes en PostgreSQL. (Es una buena práctica usar JOIN explícito condiciones para que las consultas sean más fáciles de leer y mantener).

Lo mismo es no verdadero para un LEFT JOIN combinado con un WHERE condición en una tabla a la derecha de la unión. El propósito de un LEFT JOIN es conservar todas las filas en el lado izquierdo de la unión, independientemente de una coincidencia en el lado derecho. Si no se encuentra ninguna coincidencia, la fila se amplía con NULL valores para las columnas del lado derecho. El manual:

LEFT OUTER JOIN

Primero, se realiza una unión interna. Luego, para cada fila en T1 que no satisface la condición de combinación con ninguna fila en T2, se agrega una fila combinada con valores nulos en las columnas de T2. Por lo tanto, la tabla unida siempre tiene al menos una fila para cada fila en T1.

Si luego aplica un WHERE condición que requiere algo más que un NULL valor en las columnas de las tablas en el lado derecho, anula el efecto y convierte a la fuerza el LEFT [OUTER] JOIN para que funcione como un simple [INNER] JOIN , solo (posiblemente) más caro debido a un plan de consulta más complicado.

En una consulta con muchas tablas unidas, Postgres (o cualquier RDBMS) tiene dificultades para encontrar el mejor (o incluso un buen) plan de consulta. El número de secuencias teóricamente posibles para unir tablas crece factorialmente (!). Postgres usa el "Optimizador de consultas genérico" para la tarea y hay algunas configuraciones para influir en él.

Ofuscar la consulta con LEFT JOIN engañoso como se describe, dificulta el trabajo del planificador de consultas, es engañoso para los lectores humanos y, por lo general, sugiere errores en la lógica de la consulta.

Respuestas relacionadas para problemas derivados de esto:

  • ¿Por qué nulo es igual a entero en WHERE?
  • Consulta con LEFT JOIN que no devuelve filas para el conteo de 0
  • Consulta SQL usando combinación externa y limitando registros secundarios para cada padre
  • Unión externa izquierda que actúa como una unión interna
  • Seleccionar filas que no están presentes en otra tabla

Etc.