2011-08-25 20 views
25

Tuve que revisar algún código, y encontré algo que alguien hizo, y no puedo pensar en una razón, mi camino es mejor. Y probablemente no lo es, entonces, ¿cuál es mejor/más seguro/más eficiente?MAX vs Top 1 - ¿cuál es mejor?

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.

Respuesta

13

El rendimiento es generalmente similar, si su tabla está indexada.

Vale la pena teniendo en cuenta sin embargo: Top por lo general sólo tiene sentido si está ordenando sus resultados (? Otra cosa, top de lo)

Solicitud de un resultado requiere más procesamiento.

Min no siempre requiere orden. (Solo depende, pero a menudo no necesita ordenar o agrupar, etc.)

En sus dos ejemplos, esperaría que speed/x-plan sea muy similar. Siempre puede consultar sus estadísticas para asegurarse, pero dudo que la diferencia sea significativa.

+1

SQL Server TOP 1 se comporta de forma diferente que Oracle usando rowNum = 1. Oracle realmente capta el primero que encuentra ANTES de ordenar, por lo que este método es válido solo para SQL Server. Otro beneficio de este TOP 1 vs Max() es que puede tomar tantas columnas como desee, siempre y cuando incluya los pedidos aplicables. Probé usando Max() y encontré incluso con GROUP BY que no parecía producir solo 1 registro. Tal vez alguien como Mojo más fuerte pueda decir cómo obtener solo una fila si quiere obtener la parte superior de varias columnas sin una subconsulta. – gordon

10

Son consultas diferentes.

El primero devuelve muchos registros (el mayor a_date para cada event_id encuentra dentro a_primary_key = 5)

El segundo devuelve un registro (el más pequeño a_date encuentran dentro a_primary_key = 5).

+2

o.O la primera consulta aún devolverá un registro –

+1

@Shredder Siempre que 'a_primary_key' sea realmente una clave principal, lo hará. Pero si se trata de una clave principal, solo tiene una fecha en 'a_date', y no necesita' max' ni 'top'. – GSerg

+0

Incluso si no lo fue, aún devolverá un registro. http://www.w3schools.com/sql/sql_func_max.asp –

0

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 por cada event_id diferente encontrado. La segunda consulta simplemente tomará el primer a_date con un a_primary_key = 5 que se encuentra en el conjunto de resultados.

+1

No captará el primer valor. 'Top', cuando se combina con' order by asc', seleccionará el valor más pequeño. – GSerg

+0

wth estás fumando hermano, dame algo de eso ... * obtendrá el primer valor encontrado, y sí, en este caso será el más pequeño ya que ASC pasa de menor a mayor, haciendo que el primer valor sea el más pequeño .. –

5

Para las consultas que tienen el mismo resultado que se necesita:

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 lo que es más rápida es comprobar el plan de consulta y hacer sus puntos de referencia. Hay muchos factores que afectarían la velocidad, como el tamaño de tabla/almacenamiento dinámico, etc. E incluso diferentes versiones de la misma base de datos pueden optimizarse para favorecer una consulta sobre la otra.

+3

No es necesario agrupar en el primer ejemplo (porque solo tiene un grupo, según su cláusula WHERE). – Chains

+0

@kuru: No estoy seguro de que pueda usar una función agregada sin un grupo, pero si es así ... tiene razón – vol7ron

+3

Siempre y cuando solo esté seleccionando aggs (como está en su respuesta), estás bien. Si incluye un valor no agregado en la selección, entonces necesita un grupo por. – Chains

28

1) Cuando hay un índice agrupado sobre la mesa y la columna a ser consultado, tanto para el operador MAX() y la consulta SELECT TOP 1 tendrá un rendimiento casi idéntico.

2) Cuando no hay índice agrupado en la tabla y la columna que se consultará, el operador MAX() ofrece el mejor rendimiento.

Referencia: http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/

0

realizo max y la parte superior en una mesa con 20,00,000+ registros, y encontraron que Top dan más rápido resultado con el fin de que max o función min.

Por lo tanto, la mejor manera es ejecutar su consulta una por una durante un tiempo y verificar el tiempo transcurrido de la conexión para.

Cuestiones relacionadas