así que estaba tratando de explicar a algunas personas por qué esta consulta es una mala idea:En SQL Server, ¿TOP es determinista de forma predeterminada cuando se usa en una tabla con un índice agrupado?
SELECT z.ReportDate, z.Zipcode, SUM(z.Sales) AS Sales,
COALESCE(
(SELECT TOP (1) GroupName
FROM dbo.zipGroups
WHERE (Zipcode = z.Zipcode)), 'Unknown') AS GroupName,
COALESCE(
(SELECT TOP (1) GroupCode
FROM dbo.zipGroups
WHERE (Zipcode = z.Zipcode)), 0) AS GroupNumber
FROM dbo.Report_ByZipcode AS z
GROUP BY z.ReportDate, z.Zipcode
y sugerir una mejor manera de escribirlo, cuando mi jefe terminó la discusión con, "Bueno, ha estado volviendo la datos correctos para el último año y no hemos tenido ningún problema con eso, así que está bien ".
En ese momento pensé para mis adentros, ¿cómo es eso posible?
Después de algo de investigación, he descubierto estos hechos:
- Esta consulta se supone que las ventas del grupo por código postal y la fecha, y vincular los del grupo más grande (por tamaño de la población) que un CP se asigna a por forma de la tabla zipGroups.
- Cada código postal se puede asignar a 0 en muchos grupos, y si se asigna un código postal a 0 grupos, simplemente no está en la tabla zipGroups.
- Un grupo es un área geográfica, y los GroupNumbers se clasifican de mayor a menor por población (por ejemplo, el grupo que cubre el área tri-estatal NY-NJ-CT es GroupNumber 1, y North Platte, Nebraska es GroupNumber 209)
- La tabla zipGroups no ha cambiado en al menos 2 años.
- La tabla zipGroups tiene un índice agrupado con código postal, GroupNumber (ascendente) como las claves.
- La combinación de código postal, GroupNumber es única en zipGroups.
Entonces mi pregunta tiene 2 partes.
A) Aunque no hay cláusulas ORDER BY en esas consultas SELECT TOP, ¿son realmente deterministas porque el índice agrupado básicamente le proporciona un ORDER BY predeterminado?
B1) Si eso es cierto, ¿es la consulta, aunque precariamente, haciendo realmente lo que se supone que tiene que hacer?
B2) Si eso no es cierto, ¿me pueden ayudar a demostrarlo?
Nota: Ya he vuelto a escribir esto para utilizar las uniones, por lo que no necesito el SQL para arreglarlo, tengo que ponerlo en producción, así que dejo de preocuparme por su ruptura.
Simple y llana: si no hay 'ORDER BY' no hay ** garantía ** para ningún orden –
Problema: qué decirle al jefe que dice" está bien ". –
No es lógicamente determinista, incluso si, desde una perspectiva práctica, el optimizador de consultas no hiciera nada más. Si necesita un comportamiento particular, debe especificarlo, de lo contrario, el siguiente paquete/versión de servicio puede quebrar sus consultas (el uso de 'TOP 100 PERCENT' en Views o el uso de variables para concatenar cadenas le viene a la mente). Parece un riesgo completamente sin sentido, ya que no hay beneficio por no ser explícito. –