Jakie znaczenie ma identyfikator_indeksu <256000?

11

W pewnym samouczku, który przeczytałem, autor filtruje sys.indexesna podstawie predykatu index_id < 256000. Co to osiąga?

usr
źródło
2
Może skopiowali kod zsys.sysindexkeys
Martin Smith
1
@Martin Oh, fuj.
Aaron Bertrand
1
@AaronBertrand - a także w sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesale przypuszczam, że to będzie tylko aktualizowane, jeśli liczba magia nie jest już ważny.
Martin Smith
1
@Martin Nie postawiłbym na to. Zwłaszcza dla widoków kompatybilności wstecznej. Co za okropny sposób wykazania, jak odzyskać metadane ...
Aaron Bertrand

Odpowiedzi:

17

Jest to oparte na błędnym przekonaniu, że indeksy XML są obecnie jedynym typem, który może mieć schemat identyfikatora, który wynosi> = 256000 (przynajmniej na podstawie ich obserwacji; ten schemat nie jest udokumentowany AFAIK, więc nie jestem pewien, czy jest celowy). Prawdopodobnie dobrze w obecnych wersjach, ale kto wie, jaki typ indeksu zostanie dodany następnie i gdzie rozpocznie się jego schemat identyfikacyjny? Jeśli chcesz wykluczyć indeksy XML, teraz wykluczasz także coś innego. Na przykład indeksy przestrzenne zaczynają się od id = 384000. Jeśli powyższe zapytanie ma obejmować indeksy przestrzenne, ale nie indeksy XML, czeka ich niespodzianka.

Znacznie lepszym filtrem byłoby:

WHERE type <> 3;

... lub nawet lepiej, ponieważ jest to samo-dokumentowanie ...

WHERE type_desc <> N'XML';

A teraz, gdy chcesz również wykluczyć, powiedzmy, indeksy przestrzenne, twoje zapytanie zmienia się na ...

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

... zamiast zastanawiać się, jaki zakres liczbowy mogą zajmować (lub nie) wartości id dla indeksów przestrzennych. Powodzenia z tym.

Są one dość wyraźnie udokumentowane w sys.indexes (Transact-SQL) . Nie widzę odniesienia do tej magicznej liczby i bardzo polecam wskazanie tutaj autora samouczka, aby mogli zobaczyć, że ta magiczna liczba nie jest czymś, na czym powinni polegać (nie wspominając o uczeniu innych, na czym można polegać).

Aaron Bertrand
źródło
4
+1 to okropny zły nawyk. Zapomnij o index_id. Zwłaszcza, że ​​dokładniejsze dane do określania typu znajdują się tuż obok ... dosłownie.
Thomas Stringer,
1
Prawdopodobnie błędem projektowym SQL Servera jest wydawanie indeksu id z tą regularnością. Powinny być one losowe, aby nikt nie mógł przypadkowo na nich polegać.
usr
1

Według książki „Microsoft SQL Server 2012 Internals” Kalena Delaneya, Craiga Freemana, indeks_ideksu indeksu XML zaczyna numerować od 256000. Aby uzyskać wszystkie informacje o indeksach typów (kwerendy sys.indexes), pomijając indeksy XML, można umieścić taki filtr.

SELECT * FROM sys.indexes WHERE index_id <256000

Ten sam zestaw wyników można uzyskać, umieszczając filtr na kolumnie typu sys.indexes. Dla typu indeksów typu XML = 3.

SELECT * FROM sys.indexes WHERE type <> 3

lub

Można także użyć kolumny type_desc.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
aasim.abdullah
źródło
1
czy masz oficjalną dokumentację dotyczącą tego roszczenia?
swasheck
mam to tutaj. która strona? ponadto - szanuję tych autorów, ale nie jestem pewien, czy liczy się to jako „oficjalna dokumentacja”.
swasheck
Jest to w najlepszym razie przypadkowa obserwacja Kalena w określonym momencie, bez wiedzy, że było to celowe, nie wspominając o przyszłościowej zdolności do ustalenia, czy jakiś nowy typ indeksu będzie w przyszłości> 256000. Nie jest to coś, na co Microsoft zamierzał polegać, dlatego nie znajdziesz żadnego odniesienia do tego w oficjalnej dokumentacji. I zgadzam się z @swasheck, chociaż ta książka jest zdecydowanie cennym zasobem, nie jest to jednak oficjalna dokumentacja.
Aaron Bertrand
3
@swasheck pytanie brzmi: dlaczego używana jest liczba 256000, a nie to, co jest bezpieczne. Aby uzyskać najlepszą praktykę, zdecydowanie chciałbym pójść z Aaronem
aasim.abdullah
1
„Co to osiąga?” Technicznie odpowiedź brzmiałaby „nic”. W międzyczasie ludzie skorelowali filtrowanie indeksów XML.
swasheck