Pregunta

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM  PRACOWNICY
    GROUP BY NR_DZIALU
    HAVING NR_DZIALU = 30

o

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
¿Fue útil?

Solución

La teoría (por teoría quiero decir SQL Standard ) dice que WHERE restringe el conjunto de resultados antes de devolver filas y HAVING restringe el conjunto de resultados después de traer todas las filas. Entonces DONDE es más rápido. En los DBMS compatibles con SQL Standard a este respecto, solo use HAVING donde no pueda poner la condición en un WHERE (como las columnas calculadas en algunos RDBMS).

Puede ver el plan de ejecución para ambos y verificarlo usted mismo, nada superará eso (medición para su consulta específica en su entorno específico con sus datos).

Otros consejos

Puede depender del motor. MySQL, por ejemplo, aplica TENER casi el último en la cadena, lo que significa que casi no hay espacio para la optimización. Del manual :

  

La cláusula HAVING se aplica casi al final, justo antes de que los elementos se envíen al cliente, sin optimización. (LIMIT se aplica después de HABER.)

Creo que este comportamiento es el mismo en la mayoría de los motores de bases de datos SQL, pero no puedo garantizarlo.

Las dos consultas son equivalentes y su optimizador de consultas DBMS debería reconocer esto y producir producir el mismo plan de consulta. Puede que no sea así, pero la situación es bastante simple de reconocer, por lo que esperaría que cualquier sistema moderno, incluso Sybase, se ocupe de eso.

Las cláusulas HAVING deben usarse para aplicar condiciones a las funciones de grupo, de lo contrario, pueden trasladarse a la condición WHERE. Por ejemplo. si desea restringir su consulta a grupos que tienen COUNT (DZIALU) > 10, digamos, necesitaría poner la condición en un TENER porque actúa en los grupos, no en las filas individuales.

Esperaría que la cláusula WHERE sea más rápida, pero es posible que optimicen exactamente lo mismo.

Decir que optimizarían realmente no es tomar el control y decirle a la computadora qué hacer. Estoy de acuerdo en que el uso de tener no es una alternativa a una cláusula where. Tener tiene un uso especial de ser aplicado a un grupo por donde se usó algo como una suma () y desea limitar el conjunto de resultados para mostrar solo los grupos que tienen una suma () > de 100 per se. Tener trabajos en grupos, Donde trabaja en filas. Son manzanas y naranjas. Entonces, realmente, no deberían compararse, ya que son dos animales muy diferentes.

Ambas declaraciones tendrán el mismo rendimiento que SQL Server es lo suficientemente inteligente como para analizar ambas declaraciones en un plan similar.

Entonces, no importa si usa WHERE o HAVING en su consulta.

Pero, idealmente debería usar la cláusula WHERE sintácticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top