Eu tenho uma tabela que tem um índice clusterizado como abaixo:
CREATE CLUSTERED INDEX [IX_MachineryId_DateRecorded]
ON Machinery (MachineryId, DateRecorded)
Estou selecionando com base nos campos do índice clusterizado, além de mais um:
SELECT DateRecorded, Latitude, Longitude
FROM MachineryReading
WHERE MachineryId = 2127 -- First key in the index
AND DateRecorded > '2017-01-10' -- Second key in the index
AND DateRecorded < '2017-10-16' -- Second key in the index
AND FixStatus >= 2 -- Not a key, resulting in a scan
ORDER BY DateRecorded
Eu esperava que isso resultasse em uma simples varredura de índice clusterizado. No entanto, observando as estatísticas de consulta ao vivo e o plano de execução real, a maior parte do tempo de execução da consulta vem da classificação dos resultados após a verificação do índice. Por que os dados ordenados estão sendo classificados novamente?
Sua consulta acessa 10 partições e você está pesquisando um intervalo de 10 meses, então meu palpite é que ele é particionado no mês de
DateRecorded
.Eu posso reproduzir seu plano com o tipo com o abaixo.
mas tecnicamente uma classificação poderia ser evitada se você pudesse obter um plano que processasse as partições em ordem e apenas concatenasse um resultado ordenado para o próximo.
Se você estiver feliz em assumir que os números das partições estarão em ordem de valor (não sei se isso é realmente garantido, mas parece ser o caso mesmo após a divisão da partição), adicione uma coluna inicial ao tipo da partição número atinge isso