MAX vs Top 1 - ¿cuál es mejor?
Tuve que revisar algún código, y me encontré con algo que alguien hizo, y no puedo pensar en una razón por la que mi camino es mejor. Y probablemente no lo es, entonces, ¿cuál es mejor / más seguro / más eficiente?
SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id
O
SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date
Me habría ido con la segunda opción, pero no estoy seguro de por qué, y si eso es correcto.
6 answers
El rendimiento es generalmente similar, si su tabla está indexada.
Vale la pena considerar sin embargo: Top
generalmente solo tiene sentido si está ordenando sus resultados (de lo contrario, top
de ¿qué?)
Ordenar un resultado requiere más procesamiento.
Min no siempre requiere pedido. (Solo depende, pero a menudo no necesita orden por o grupo por, etc.)
En sus dos ejemplos, esperaría que speed / x-plan sea muy similar. Siempre puede recurrir a sus estadísticas para hacer claro, pero dudo que la diferencia sea significativa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-25 23:50:21
1) Cuando hay un índice agrupado en la tabla y la columna a consultar, tanto el operador MAX()
como la consulta SELECT TOP 1
tendrán un rendimiento casi idéntico.
2) Cuando no hay un índice agrupado en la tabla y la columna a consultar, el operador MAX()
ofrece el mejor rendimiento.
Referencia: http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-29 01:57:25
Son diferentes consultas.
El primero devuelve muchos registros (el mayor a_date
para cada event_id
encontrado dentro de a_primary_key = 5
)
El segundo devuelve un registro (el más pequeño a_date
encontrado dentro de a_primary_key = 5
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-25 23:31:51
Para que las consultas tengan el mismo resultado necesitas:
SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5
SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC
La mejor manera de saber cuál es más rápido es comprobar el plan de consultas y hacer sus puntos de referencia. Hay muchos factores que afectarían la velocidad, como el tamaño de la tabla/montón, etc. E incluso diferentes versiones de la misma base de datos pueden optimizarse para favorecer una consulta sobre la otra.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-26 01:14:38
Realizo max y top en una mesa con más de 20,00,000 registros , y encontró que Superior dar resultado más rápido con orden por que max o min función.
Por lo tanto , la mejor manera es ejecutar tanto su consulta uno por uno durante algún tiempo y comprobar el tiempo transcurrido de conexión para que.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-28 13:01:15
MAX
y TOP
funcionan de manera diferente. Su primera consulta devolverá el valor máximo encontrado para a_date
que tiene un a_primary_key = 5
para cada event_id
diferente encontrado. La segunda consulta simplemente tomará el primer a_date
con un a_primary_key = 5
encontrado en el conjunto de resultados.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-25 23:44:06