Qual o significado de um index_id <256000?

11

Em um certo tutorial, li que o autor está filtrando com sys.indexesbase no predicado index_id < 256000. O que isso faz?

usr
fonte
2
Talvez eles tenham copiado o código desys.sysindexkeys
Martin Smith
1
@ Martin Oh, eca.
Aaron Bertrand
1
@AaronBertrand - e também em sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesmas eu suponho que estes só vai ficar atualizado se o número mágico não é mais válido.
Martin Smith
1
@ Martin Eu não apostaria nisso. Especialmente para as visualizações de compatibilidade com versões anteriores. Que maneira horrível para demonstrar como recuperar metadados ...
Aaron Bertrand

Respostas:

17

Isso se baseia no equívoco de que os índices XML atualmente são o único tipo que poderia ter um esquema de ID> = 256000 (pelo menos com base em suas observações; esse esquema não está documentado no AFAIK, portanto, nem tenho certeza se é intencional). Provavelmente bem nas versões atuais, mas quem sabe que tipo de índice será adicionado a seguir e onde o esquema de identificação será iniciado? Se você deseja excluir índices XML, agora também está excluindo outra coisa. Os índices espaciais, por exemplo, parecem começar com id = 384000. Se a consulta acima pretender incluir índices espaciais, mas não índices XML, será uma surpresa.

Um filtro muito melhor seria:

WHERE type <> 3;

... ou melhor ainda, uma vez que é auto-documentável ...

WHERE type_desc <> N'XML';

E agora, quando você também deseja excluir, por exemplo, índices espaciais, sua consulta muda para ...

WHERE type_desc NOT IN (N'XML', N'SPATIAL');

... em vez de precisar descobrir qual intervalo numérico os valores de ID para índices espaciais podem ocupar (ou não). Boa sorte com isso.

Eles estão claramente documentados em sys.indexes (Transact-SQL) . Não vejo referência a esse número mágico e recomendo que você aponte o autor do tutorial aqui para que eles possam ver que esse número mágico não é algo em que deveriam confiar (não importa ensinar os outros a confiarem).

Aaron Bertrand
fonte
4
+1 é um péssimo hábito. Esqueça index_id. Especialmente porque dados mais precisos para determinar o tipo estão bem ao lado ... literalmente.
Thomas Stringer
1
Provavelmente, é um erro de design do SQL Server fornecer index_id com essa regularidade. Eles devem ser randomizados para que ninguém possa confiar neles por engano.
usr
1

De acordo com o livro "Microsoft SQL Server 2012 Internals" Por Kalen Delaney, Craig Freeman, o index_id do índice XML começa a numerar com 256000. Portanto, para obter todas as informações de índices de tipo (consulta sys.indexes), mas ignorando índices XML, você pode colocar um filtro assim.

SELECT * FROM sys.indexes WHERE index_id <256000

O mesmo conjunto de resultados pode ser obtido colocando o filtro na coluna de tipo sys.indexes. Para o tipo XML de índices, digite = 3.

SELECT * FROM sys.indexes WHERE type <> 3

ou

A coluna type_desc também pode ser usada.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
aasim.abdullah
fonte
1
você tem documentação oficial para esta reivindicação?
precisa
eu tenho aqui. Qual página? Além disso - eu respeito muito esses autores, mas não sei se isso conta como "documentação oficial".
precisa
Essa é uma observação casual, na melhor das hipóteses, por Kalen em um ponto específico no tempo, sem o conhecimento de que isso era realmente intencional, não importa a capacidade de determinar se um novo tipo de índice será> 256000 no futuro. Não é algo que a Microsoft pretenda confiar, e é por isso que você não encontrará nenhuma referência a ele na documentação oficial. E concorde com o @swasheck, embora esse livro seja definitivamente um recurso valioso, não é uma documentação oficial.
Aaron Bertrand
3
A questão do @swasheck é que, por que a figura 256000 é usada, e não o que é seguro. Para melhores práticas, definitivamente eu gostaria de ir com Aaron
aasim.abdullah
1
"O que isso faz?" Tecnicamente, a resposta seria "nada". Circunstancialmente, é uma maneira que as pessoas correlacionam filtrando os índices XML.
`` swasheck