Recentemente, fiz uma pergunta sobre a melhor estratégia de indexação para uma tabela que deve registrar eventos, em ordem, em relação a um GUID. O GUID é um incômodo, mas é inevitável porque é um FK para outro lugar.
Em termos das consultas que quero fazer, elas são essencialmente da formaSELECT TOP N SomeColumn FROM t WHERE GuidColumn = 'someguid' ORDER BY AutoIncInt DESC
Eu fiz algumas experiências e uma boa abordagem de compensação parece ser:
- Crie a
AutoIncInt
coluna na tabela como a chave de clustering exclusiva - Crie um índice não clusterizado não exclusivo em
GuidColumn
eINCLUDE SomeColumn
No começo eu tinha o índice nonclustering em SomeGuid ASC, AutoIncInt DESC
, pensando que ajudaria a ORDER BY AutoIncInt DESC
parte da consulta mas o plano permaneceu o mesmo quando eu o removi - nenhuma operação de classificação foi necessária e a consulta apenas atingiu o índice NC, fez um top e um select; parece que o SQLServer é de alguma forma inteligente o suficiente para saber, mesmo quando AutoIncInt não é citado no índice de não clustering, há uma maneira de obter facilmente os dados em ordem / calcular facilmente quais últimas N linhas são necessárias para o TOP
Como esse mecanismo funciona na prática? O índice sem cluster tem uma ordem implícita graças à referência ao índice de cluster, de modo que o SQLS possa deduzir rápida e facilmente de quais nós de índice N eu quero a SomeColumn?