Hay 2 preguntas aquí: La respuesta a la primera de las cuales es sí: El conjunto de resultados de una consulta HAVING
-Laden es idéntica a la del conjunto de resultados de la misma consulta ejecutada como una subconsulta, decorado con una cláusula WHERE
.
La segunda pregunta es sobre el rendimiento y la expresividad: aquí profundizamos en la implementación. En MySQL hay una delgada línea roja, donde el rendimiento comienza a desviarse: el momento en que el conjunto de resultados de la consulta interna ya no puede mantenerse en la memoria. En este caso, MySQL creará una representación en el disco de la consulta interna y luego usará el selector WHERE
. Esto no sucederá, si se usa la cláusula HAVING
, el grupo descalificado se eliminará del conjunto de resultados.
Esto implica que cuanto mayor sea la selectividad de la cláusula HAVING
, mayor relevancia tendrá el rendimiento: Considere el conjunto de resultados de un millón de filas de la consulta interna, que se reduce por la cláusula HAVING
a 5 filas - es muy es probable que el conjunto de resultados de la consulta interna no se guarde en la memoria, pero es muy probable que el conjunto de resultados final lo haga.
Editar
I tenía una vez: la consulta seleccionada los pocos valores atípicos de una tabla muy uniformemente distribuida (Número de piezas producidas en una máquina física en un taller por día). Investigué debido a la alta carga de IO.
Editar 2
Por favor, tenga en cuenta, que la caché de consultas es no utiliza para subconsultas - En mi humilde opinión un desarrollo lugar debería centrarse más en - por lo que el patrón de subconsulta no se beneficiarán del ser consulta interna un conjunto de resultados en caché
Debe definir RDBMS a la pregunta, supongo. Su primera consulta no es válida en SQL Server 2008, porque no puede hacer una referencia en Tener en un alias en la selección. Solo en la parte OrderBy, debido al procesamiento de consultas lógicas. –
Sospecho que MySQL? La primera consulta tampoco es válida en Oracle por el mismo motivo. – Ben
@Ben Sí, acabo de agregar la etiqueta MySQL para aclarar. Gracias. – fredoverflow