Esta é uma pergunta derivada da ordem de classificação especificada na chave primária, mas a classificação é executada em SELECT .
@Catcall diz isso sobre o assunto da ordem de armazenamento (índice clusterizado) e da ordem de saída
Muitas pessoas acreditam que um índice em cluster garante uma ordem de classificação na saída. Mas não é isso que faz; garante uma ordem de armazenamento em disco. Veja, por exemplo, esta postagem no blog .
Eu li o post de Hugo Kornelis e entendo que um índice não garante que o servidor sql leia os registros em uma ordem específica. No entanto, tenho dificuldade em aceitar que não posso assumir isso para o meu cenário?
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])
Minha consulta original foi esta:
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
ORDER BY Date DESC
Mas sugiro que eu também possa usar este (leia abaixo para minha explicação):
SELECT TOP 1 SensorValue
FROM SensorValues
WHERE SensorId = 53
AND DeviceId = 3819
AND Date < 1339225010
Como você pode ver, minhas linhas da tabela são pequenas (16 bytes) e eu tenho apenas um índice, um cluster. No meu cenário, a tabela consiste em 100.000.000 registros neste momento (e isso provavelmente aumentará dez vezes).
Quando o servidor de banco de dados consulta essa tabela, ele tem duas maneiras de encontrar minhas linhas: ele procura a chave primária e, assim, lê e retorna meus valores em desc. Data ou deve fazer uma verificação completa da tabela. Minha conclusão é que uma verificação completa da tabela em todos esses registros será muito lenta e, portanto, o servidor de banco de dados sempre buscará a tabela por meio de sua chave primária, retornando os valores classificados porDate DESC
ORDER BY
cláusula é um grande desempenho para mim (leia a outra pergunta para obter mais informações). Eu tenho uma solução que funciona por enquanto, mas ela não funciona quando e se meu tráfego aumentar.
ORDER BY
cláusula na sua consulta. Isso é verdade para SQL Server , Oracle , MySQL e qualquer outro RDBMS que você possa imaginar. Tente qualquer outra coisa e você está se preparando para um copo surpresa de FAIL.
ORDER BY
lá, então você sabe que pode confiar nele. Veja o # 3 aqui