Questa è una domanda derivata dall'ordinamento specificato nella chiave primaria, tuttavia l'ordinamento viene eseguito su SELECT .
Lo dice @Catcall in merito all'ordine di archiviazione (indice cluster) e all'ordine di output
Molte persone credono che un indice cluster garantisca un ordinamento sull'output. Ma non è quello che fa; garantisce un ordine di archiviazione su disco. Vedi, ad esempio, questo post sul blog .
Ho letto il post sul blog di Hugo Kornelis e capisco che un indice non garantisce che il server sql legga i record in un ordine specifico. Eppure faccio fatica ad accettare che non posso assumerlo per il mio scenario?
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])
La mia domanda originale era questa:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Ma suggerisco di poter usare anche questo (leggi sotto per la mia spiegazione):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Come puoi vedere, le righe della mia tabella sono piccole (16 byte) e ho solo un indice, un cluster. Nel mio scenario, la tabella è composta da 100.000.000 di record in questo momento (e molto probabilmente aumenterà di dieci volte).
Quando il server di database interroga questa tabella ha due modi per trovare le mie righe, o cerca la chiave primaria e quindi legge e restituisce i miei valori in desc. ordine di data, oppure deve eseguire una scansione completa della tabella. La mia conclusione è che una scansione completa della tabella su tutti quei record sarà troppo lenta e il server di database cercherà quindi sempre la tabella tramite la sua chiave primaria e quindi restituendo i valori ordinati perDate DESC
ORDER BY
clausola è un grande successo per me (leggi l' altra domanda per maggiori informazioni). Ho una soluzione che funziona per ora, ma non regge quando e se il mio traffico aumenta.
ORDER BY
clausola nella tua query. Questo è vero per SQL Server , Oracle , MySQL e qualsiasi altro RDBMS a cui puoi pensare. Prova qualsiasi altra cosa e ti stai preparando per una tazza a sorpresa di FAIL.
ORDER BY
pezzo e sai che puoi fare affidamento su di esso. Vedi n. 3 qui