Esta es una pregunta derivada del orden de clasificación especificada en la clave principal, pero la clasificación se ejecuta en SELECT .
@Catcall dice esto sobre el tema del orden de almacenamiento (índice agrupado) y el orden de salida
Mucha gente cree que un índice agrupado garantiza un orden de clasificación en la salida. Pero eso no es lo que hace; garantiza una orden de almacenamiento en disco. Ver, por ejemplo, esta publicación de blog .
He leído la publicación de blog de Hugo Kornelis y entiendo que un índice no garantiza que el servidor SQL lea los registros en un orden específico. Sin embargo, ¿me cuesta aceptar que no puedo asumir esto para mi situación?
CREATE TABLE [dbo].[SensorValues](
[DeviceId] [int] NOT NULL,
[SensorId] [int] NOT NULL,
[SensorValue] [int] NOT NULL,
[Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED
(
[DeviceId] ASC,
[SensorId] ASC,
[Date] DESC
) WITH (
FILLFACTOR=75,
DATA_COMPRESSION = PAGE,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [MyPartitioningScheme]([Date])
Mi consulta original fue esta:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Pero sugiero que también podría usar este (lea a continuación para obtener mi explicación):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Como puede ver, las filas de mi tabla son pequeñas (16bytes) y solo tengo un índice, un clúster. En mi escenario, la tabla consta de 100.000.000 registros en este momento (y esto probablemente aumentará diez veces).
Cuando el servidor de bases de datos consulta esta tabla, tiene dos formas de encontrar mis filas, o busca la clave primaria y, por lo tanto, lee y devuelve mis valores en desc. orden de fecha, o tiene que hacer un escaneo completo de la tabla. Mi conclusión es que una exploración completa de la tabla en todos esos registros será demasiado lenta y, por lo tanto, el servidor de la base de datos siempre buscará la tabla a través de su clave principal y, por lo tanto, devolverá los valores ordenados porDate DESC
ORDER BY
cláusula es un gran éxito para mí (lea la otra pregunta para obtener más información). Tengo una solución que funciona por ahora, pero no se mantendrá cuando y si mi tráfico aumenta.
ORDER BY
cláusula en su consulta. Esto es cierto para SQL Server , Oracle , MySQL y cualquier otro RDBMS que se te ocurra. Pruebe cualquier otra cosa y se está preparando para una taza sorpresa de FALLA.
ORDER BY
allí y sabes que puedes confiar en ella? Ver # 3 aquí