Quelle est la signification d'un index_id <256000?

11

Dans un certain tutoriel, j'ai lu que l'auteur filtre en sys.indexesfonction du prédicat index_id < 256000. Qu'est-ce que cela accomplit?

usr
la source
2
Peut-être qu'ils ont copié le code desys.sysindexkeys
Martin Smith
1
@Martin Oh, beurk.
Aaron Bertrand
1
@AaronBertrand - et aussi sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesmais je suppose que ce sera tout simplement mis à jour si le se chiffre magique n'est plus valide.
Martin Smith
1
@Martin, je ne parierais pas dessus. Surtout pour les vues de compatibilité descendante. Quelle horrible façon de montrer comment récupérer des métadonnées ...
Aaron Bertrand

Réponses:

17

Ceci est basé sur l'idée fausse selon laquelle les index XML sont actuellement le seul type qui pourrait avoir un schéma d'identification qui est> = 256000 (au moins en fonction de leur observation; ce schéma n'est pas documenté AFAIK, donc pas même sûr s'il est intentionnel). Probablement bien dans les versions actuelles, mais qui sait quel type d'index sera ajouté ensuite et où commencera son schéma d'identification? Si vous souhaitez exclure les index XML, vous excluez désormais également autre chose. Les index spatiaux, par exemple, semblent commencer à id = 384000. Si la requête ci-dessus a l'intention d'inclure des index spatiaux mais pas des index XML, ils vont être surpris.

Un filtre bien meilleur serait:

WHERE type <> 3;

... ou mieux encore, car il est auto-documenté ...

WHERE type_desc <> N'XML';

Et maintenant, lorsque vous souhaitez également exclure, par exemple, les index spatiaux, votre requête se transforme en ...

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

... au lieu d'avoir à déterminer quelle plage numérique les valeurs id pour les index spatiaux pourraient occuper (ou non). Bonne chance avec ça.

Ceux-ci sont assez clairement documentés dans sys.indexes (Transact-SQL) . Je ne vois aucune référence à ce nombre magique et je vous recommande fortement de diriger votre auteur de didacticiel ici afin qu'ils puissent voir que ce nombre magique n'est pas quelque chose sur lequel ils devraient s'appuyer (sans parler d'apprendre aux autres à se fier).

Aaron Bertrand
la source
4
+1 c'est une terrible mauvaise habitude. Oubliez index_id. D'autant plus que des données plus précises pour déterminer le type se trouvent juste à côté ... littéralement.
Thomas Stringer
1
C'est probablement une erreur de conception de SQL Server de donner des index_id avec cette régularité. Ils doivent être randomisés afin que personne ne puisse s'y fier par erreur.
usr
1

Selon le livre "Microsoft SQL Server 2012 Internals" de Kalen Delaney, Craig Freeman, l'index_id de l'index XML commence à numéroter avec 256000. Donc, pour obtenir tous les types d'index d'informations (interrogation de sys.indexes) mais en ignorant les index XML, vous pouvez placer un filtre comme celui-ci.

SELECT * FROM sys.indexes WHERE index_id <256000

Le même jeu de résultats peut être obtenu en plaçant un filtre sur la colonne type de sys.indexes. Pour le type d'index XML, tapez = 3.

SELECT * FROM sys.indexes WHERE type <> 3

ou

La colonne type_desc peut également être utilisée.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
aasim.abdullah
la source
1
avez-vous une documentation officielle pour cette réclamation?
swasheck
je l'ai ici. quelle page? aussi - je respecte le diable de ces auteurs mais je ne suis pas sûr que cela compte comme «documentation officielle».
swasheck
C'est une observation occasionnelle, au mieux, par Kalen à un moment précis, sans savoir que c'était réellement intentionnel, sans parler de la capacité de prédire l'avenir pour déterminer si un nouveau type d'index sera> 256000 à l'avenir. Ce n'est pas quelque chose que Microsoft voulait que vous comptiez, c'est pourquoi vous ne trouverez aucune référence à ce sujet dans la documentation officielle. Et d'accord avec @swasheck, bien que ce livre soit définitivement une ressource précieuse, ce n'est pas de la documentation officielle.
Aaron Bertrand
3
La question @swasheck est la suivante: pourquoi le chiffre 256000 est-il utilisé, et non ce qui est sûr. Pour les meilleures pratiques, j'aimerais aller avec Aaron
aasim.abdullah
1
"Qu'est-ce que cela accomplit?" Techniquement, la réponse serait «rien». De manière circonstancielle, c'est une façon dont les gens ont corrélé le filtrage des index XML.
swasheck