No habrá diferencia ya que puede probarse inspeccionando los planes de ejecución. Si id
es el índice agrupado, debería ver un análisis de índice agrupado ordenado; si no está indexado, seguirá viendo un escaneo de tabla o un escaneo de índice agrupado, pero no se ordenará en ninguno de los casos.
El enfoque TOP 1
puede ser útil si desea obtener otros valores de la fila, lo que es más fácil que sacar el máximo en una subconsulta y luego unir. Si desea obtener otros valores de la fila, debe dictar cómo lidiar con los vínculos en ambos casos.
Habiendo dicho eso, hay algunos escenarios en los que el plan puede ser diferente, por lo que es importante realizar la prueba dependiendo de si la columna está indexada y si aumenta monótonamente o no. Creé una tabla simple y se inserta 50000 filas:
CREATE TABLE dbo.x
(
a INT, b INT, c INT, d INT,
e DATETIME, f DATETIME, g DATETIME, h DATETIME
);
CREATE UNIQUE CLUSTERED INDEX a ON dbo.x(a);
CREATE INDEX b ON dbo.x(b)
CREATE INDEX e ON dbo.x(e);
CREATE INDEX f ON dbo.x(f);
INSERT dbo.x(a, b, c, d, e, f, g, h)
SELECT
n.rn, -- ints monotonically increasing
n.a, -- ints in random order
n.rn,
n.a,
DATEADD(DAY, n.rn/100, '20100101'), -- dates monotonically increasing
DATEADD(DAY, -n.a % 1000, '20120101'), -- dates in random order
DATEADD(DAY, n.rn/100, '20100101'),
DATEADD(DAY, -n.a % 1000, '20120101')
FROM
(
SELECT TOP (50000)
(ABS(s1.[object_id]) % 10000) + 1,
rn = ROW_NUMBER() OVER (ORDER BY s2.[object_id])
FROM sys.all_objects AS s1
CROSS JOIN sys.all_objects AS s2
) AS n(a,rn);
GO
En mi sistema Estos valores creados en a/c 1-50000, b/d entre 3 y 9994, e/g de 2010-01-01 través 2011-05-16, y f/h desde 2009-04-28 hasta 2012-01-01.
Primero, comparemos las columnas enteras, a y c, indexadas monótonamente en aumento. una tiene un índice agrupado, c sin que:
SELECT MAX(a) FROM dbo.x;
SELECT TOP (1) a FROM dbo.x ORDER BY a DESC;
SELECT MAX(c) FROM dbo.x;
SELECT TOP (1) c FROM dbo.x ORDER BY c DESC;
Resultados:

El gran problema con la consulta cuarto es que, a diferencia de MAX
, se requiere de una especie. Aquí es 3 en comparación con 4:


Este será un problema común en todas estas variaciones de consulta: a MAX
contra una columna unindexed será capaz de lengüeta en el clúster escanear índice y realizar un agregado de flujo, mientras que TOP 1
necesita realizar un tipo que va a ser más caro.
Hice la prueba y vi exactamente los mismos resultados en las pruebas b + d, e + g, y f + h.
Por lo tanto, me parece que, además de producir más código normas de cumplimiento, hay un beneficio potencial de rendimiento para el uso de MAX
a favor de TOP 1
en función de la tabla y los índices subyacente (que puede cambiar después de que haya puesto tu código en producción). Entonces, diría que, sin más información, es preferible MAX
.
(Y como he dicho antes, TOP 1
podría ser realmente el comportamiento que está buscando, si usted está tirando de columnas adicionales. Usted querrá probar MAX
+ JOIN
métodos, así si eso es lo que está buscando.)
¿Lo has probado? Esperaría que fueran iguales si el optimizador es bueno. – Hogan
Si 'id' es un incremento automático, esta pregunta es un duplicado de http://stackoverflow.com/questions/590079/for-autoincrement-fields-maxid-vs-top-1-id-order-by-id-desc – Ben
id solo significa CUALQUIER columna de cualquier tipo –