Welche Bedeutung hat eine index_id <256000?

11

In einem bestimmten Tutorial habe ich gelesen, dass der Autor sys.indexesnach dem Prädikat filtert index_id < 256000. Was bringt das?

usr
quelle
2
Vielleicht haben sie den Code vonsys.sysindexkeys
Martin Smith
1
@ Martin Oh, yuck.
Aaron Bertrand
1
@AaronBertrand - und auch in sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesaber ich denke , diese werden nur aktualisiert, wenn die magische Zahl ist nicht mehr gültig.
Martin Smith
1
@ Martin Ich würde nicht darauf wetten. Speziell für die Abwärtskompatibilitätsansichten. Was für eine schreckliche Art zu demonstrieren, wie man Metadaten abruft ...
Aaron Bertrand

Antworten:

17

Dies basiert auf dem Missverständnis, dass XML-Indizes derzeit der einzige Typ sind, der jemals ein ID-Schema haben könnte, das> = 256000 ist (zumindest basierend auf ihrer Beobachtung; dieses Schema ist nicht AFAIK dokumentiert, also nicht einmal sicher, ob es beabsichtigt ist). Wahrscheinlich in aktuellen Versionen in Ordnung, aber wer weiß, welche Art von Index als nächstes hinzugefügt wird und wo das ID-Schema beginnt? Wenn Sie XML-Indizes ausschließen möchten, schließen Sie jetzt auch etwas anderes aus. Räumliche Indizes scheinen beispielsweise bei id = 384000 zu beginnen. Wenn die obige Abfrage räumliche Indizes, aber keine XML-Indizes enthalten soll, werden sie überrascht sein.

Ein viel besserer Filter wäre:

WHERE type <> 3;

... oder noch besser, da es sich selbst dokumentiert ...

WHERE type_desc <> N'XML';

Und jetzt, wenn Sie beispielsweise auch räumliche Indizes ausschließen möchten, ändert sich Ihre Abfrage in ...

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

... anstatt herauszufinden, welchen numerischen Bereich die ID-Werte für räumliche Indizes belegen könnten (oder nicht). Viel Glück damit.

Diese sind in sys.indexes (Transact-SQL) ziemlich klar dokumentiert . Ich sehe keinen Hinweis auf diese magische Zahl und ich empfehle Ihnen dringend, Ihren Autor des Tutorials hier zu verweisen, damit er sehen kann, dass diese magische Zahl nicht etwas ist, auf das er sich verlassen sollte (es macht nichts aus, anderen beizubringen, sich darauf zu verlassen).

Aaron Bertrand
quelle
4
+1 das ist eine schrecklich schlechte Angewohnheit. Vergiss es index_id. Zumal genauere Daten zur Typbestimmung direkt daneben liegen ... im wahrsten Sinne des Wortes.
Thomas Stringer
1
Es ist wahrscheinlich ein Entwurfsfehler von SQL Server, index_id's mit dieser Regelmäßigkeit auszugeben. Sie sollten randomisiert werden, damit sich niemand fälschlicherweise auf sie verlassen kann.
usr
1

Laut Buch "Microsoft SQL Server 2012 Internals" von Kalen Delaney, Craig Freeman, beginnt die Index-ID des XML-Index mit 256000 zu nummerieren. Um also alle Informationen zu Typindizes zu erhalten (sys.indexes abzufragen), aber XML-Indizes zu überspringen, können Sie einen solchen Filter platzieren.

SELECT * FROM sys.indexes WHERE index_id <256000

Dieselbe Ergebnismenge kann erreicht werden, indem ein Filter in die Typspalte von sys.indexes eingefügt wird. Für den XML-Indextyp geben Sie = 3 ein.

SELECT * FROM sys.indexes WHERE type <> 3

oder

Die Spalte type_desc kann ebenfalls verwendet werden.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
aasim.abdullah
quelle
1
Haben Sie offizielle Unterlagen für diesen Anspruch?
Swasheck
Ich habe es genau hier. welche Seite? auch - ich respektiere das Heck dieser Autoren, aber ich bin nicht sicher, ob dies als "offizielle Dokumentation" gilt.
Swasheck
Dies ist bestenfalls eine beiläufige Beobachtung von Kalen zu einem bestimmten Zeitpunkt, ohne zu wissen, dass dies tatsächlich beabsichtigt war, ohne Rücksicht auf die Fähigkeit, zu bestimmen, ob ein neuer Indextyp in Zukunft> 256000 sein wird. Microsoft wollte nicht, dass Sie sich darauf verlassen, weshalb Sie in der offiziellen Dokumentation keinen Hinweis darauf finden. Und stimmen Sie @swasheck zu, obwohl dieses Buch definitiv eine wertvolle Ressource ist, ist es keine offizielle Dokumentation.
Aaron Bertrand
3
@washeck Frage ist, warum Abbildung 256000 verwendet wird und nicht, was sicher ist. Für Best Practice würde ich definitiv gerne mit Aaron gehen
aasim.abdullah
1
"Was bringt das?" Technisch wäre die Antwort "nichts". Umständlich ist es eine Art und Weise, wie Menschen das Herausfiltern von XML-Indizes korreliert haben.
Swasheck