a primeira consulta faz uma varredura de tabela com base no limite que expliquei anteriormente: É possível aumentar o desempenho da consulta em uma tabela estreita com milhões de linhas?
(provavelmente sua consulta sem a TOP 1000
cláusula retornará mais de 46k linhas. ou em algum lugar entre 35k e 46k. (a área cinza ;-))
a segunda consulta, deve ser ordenada. Como o índice NC é ordenado na ordem que você deseja, é mais barato para o otimizador usá-lo e, em seguida, para as pesquisas de indicadores no índice clusterizado para obter as colunas ausentes comparadas com a realização de uma varredura de índice clusterizado e a necessidade de para pedir isso.
inverta a ordem das colunas na ORDER BY
cláusula e você retornará a uma varredura de índice em cluster, pois o NC INDEX é inútil.
editar esqueceu a resposta para sua segunda pergunta, por que você não quer isso
O uso de um índice sem cobertura não agrupado em cluster significa que um ID da linha é pesquisado no índice NC e, em seguida, as colunas ausentes precisam ser pesquisadas no índice agrupado (o índice agrupado contém todas as colunas de uma tabela). As E / S para pesquisar as colunas ausentes no índice clusterizado são E / S aleatórias.
A chave aqui é ALEATÓRIA. porque para cada linha encontrada no índice NC, os métodos de acesso precisam procurar uma nova página no índice clusterizado. Isso é aleatório e, portanto, muito caro.
Agora, por outro lado, o otimizador também pode fazer uma varredura de índice em cluster. Ele pode usar os mapas de alocação para procurar intervalos de varredura e apenas começar a ler o índice em cluster em grandes partes. Isso é seqüencial e muito mais barato. (contanto que sua tabela não esteja fragmentada :-)) A desvantagem é que o índice cluster INTEIRO precisa ser lido. Isso é ruim para o seu buffer e potencialmente uma enorme quantidade de pedidos de veiculação. mas ainda, E / S sequenciais.
No seu caso, o otimizador decide algo entre 35k e 46k linhas, é mais barato para uma varredura completa de índice em cluster. Sim, está errado. E em muitos casos, com índices estreitos e sem cluster, sem WHERE
cláusulas seletivas ou uma tabela grande, isso dá errado. (Sua mesa é pior, porque também é uma mesa muito estreita.)
Agora, adicionar o ORDER BY
torna mais caro verificar o índice clusterizado completo e depois solicitar os resultados. Em vez disso, o otimizador assume que é mais barato usar o índice NC já solicitado e, em seguida, paga a penalidade aleatória de IO pelas pesquisas de favoritos.
Portanto, seu pedido é um tipo de solução "dica de consulta" perfeita. MAS, em um determinado momento, quando os resultados da sua consulta forem tão grandes, a penalidade para as entradas / saídas aleatórias da pesquisa de favoritos será tão grande que se tornará mais lenta. Presumo que o otimizador altere os planos novamente para a verificação de índice em cluster antes desse ponto, mas você nunca sabe ao certo.
No seu caso, desde que suas inserções sejam ordenadas por data inserida, conforme discutido no bate-papo e na pergunta anterior (consulte o link), é melhor criar o índice de cluster na coluna DataDefinida.