2008-11-30 22 views

Respuesta

56

La teoría (por la teoría me refiero a SQL Standard) dice que WHERE restringe el conjunto de resultados antes de devolver las filas y HAVING restringe el conjunto de resultados después de traer todas las filas. Entonces, DONDE es más rápido. En SQL estándar según los DBMS en este sentido, sólo se sirve tener donde no se puede poner la enfermedad en una DONDE (como las columnas calculadas en algunos RDBMS.)

solo se puede ver el plan de ejecución para ambos y comprobar por sí mismo, nada lo hará vencer eso (medición para su consulta específica en su entorno específico con sus datos).

+0

en Sybase DB tiene el mismo tiempo de ejecución para 150 filas :) –

+0

Dije el plan de ejecución, donde puede ver qué pasos realizará la base de datos para obtener sus datos. 150 filas son muy pocos como para notar ninguna diferencia en el tiempo de ejecución, pero si el plan diferente, entonces eso tendrá importancia en las tablas con una mayor cantidad de filas. "SET del plan de" antes de ejecutar la consulta ... –

+0

... debe darle los datos de Sybase. Consulte este enlace para obtener más información: http://groups.google.com/group/comp.databases.sybase/browse_thread/thread/abd5e99d77befbfa? pli = 1 –

2

yo esperaría que la cláusula WHERE sería más rápido, pero es posible que habían optimizar exactamente a la misma.

8

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

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

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

+1

Heh, "depende del motor pero creo que todos se comportan así" :-) –

+3

Bueno, solo puedo hablar de lo que sé y especular sobre el resto :) –

5

Las dos consultas son equivalentes y su optimizador de consultas DBMS debe reconocer esto y producir producir el mismo plan de consulta. No puede, pero la situación es bastante fácil de reconocer, por lo que cabe esperar de cualquier sistema moderno - incluso Sybase - para tratar con él.

Las cláusulas HAVING se deben usar para aplicar condiciones en funciones de grupo, de lo contrario se pueden mezclar en la condición WHERE. Por ejemplo. si desea restringir la búsqueda sólo a grupos que tienen count (DZIALU)> 10, por ejemplo, que tendría que poner la enfermedad en un HAVING porque actúa sobre los grupos, no las filas individuales.

2

Decir que optimizarían no es realmente tomar el control y decirle al equipo 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 aplicada a un grupo por el que se utilizó algo así como una suma() y desea limitar el conjunto de resultados para mostrar sólo los grupos que tienen una suma()> de 100 per se. Tener trabajos en grupos, Donde funciona en filas. Son manzanas y naranjas. Entonces realmente, no deberían ser comparados ya que son dos animales muy diferentes.

0

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

Por lo tanto, no importa si utiliza WHERE o HAVING en su consulta.

embargo, lo ideal es que utilice la cláusula DONDE sintácticamente.

Cuestiones relacionadas