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.

Author: Viacheslav Avsenev, 2011-08-26

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.

 15
Author: Chains,
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/

 32
Author: Junior M,
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).

 10
Author: GSerg,
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.

 5
Author: vol7ron,
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.

 2
Author: Jay Magwadiya,
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.

 0
Author: Nick Rolando,
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