Apa signifikansi yang dimiliki index_id <256000?

11

Dalam tutorial tertentu yang saya baca penulis memfilter sys.indexesberdasarkan predikat index_id < 256000. Apa yang dicapai ini?

usr
sumber
2
Mungkin mereka menyalin kode darisys.sysindexkeys
Martin Smith
1
@ Martin Oh, yuck.
Aaron Bertrand
1
@AaronBertrand - dan juga dalam sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexestapi saya kira ini akan hanya mendapatkan update jika angka ajaib tidak berlaku lagi.
Martin Smith
1
@ Martin Saya tidak akan bertaruh untuk itu. Terutama untuk tampilan kompatibilitas mundur. Betapa mengerikan cara untuk menunjukkan cara mengambil metadata ...
Aaron Bertrand

Jawaban:

17

Ini didasarkan pada kesalahpahaman bahwa indeks XML saat ini adalah satu-satunya jenis yang dapat memiliki skema id>> 256000 (setidaknya berdasarkan pengamatan mereka; skema ini tidak didokumentasikan AFAIK, jadi bahkan tidak yakin apakah itu disengaja). Mungkin bagus di versi saat ini, tetapi siapa yang tahu jenis indeks apa yang akan ditambahkan selanjutnya dan di mana skema id-nya akan dimulai? Jika Anda ingin mengecualikan indeks XML, Anda sekarang juga mengecualikan sesuatu yang lain. Indeks spasial, misalnya, tampaknya dimulai dengan id = 384000. Jika kueri di atas berniat untuk memasukkan indeks spasial tetapi bukan indeks XML, mereka akan terkejut.

Filter yang jauh lebih baik adalah:

WHERE type <> 3;

... atau bahkan lebih baik, karena itu mendokumentasikan diri ...

WHERE type_desc <> N'XML';

Dan sekarang ketika Anda ingin juga mengecualikan, katakanlah, indeks spasial, permintaan Anda berubah menjadi ...

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

... daripada harus mencari tahu kisaran numerik apa yang mungkin ditempati oleh nilai id untuk indeks spasial (atau tidak). Semoga beruntung dengan itu.

Ini cukup jelas didokumentasikan dalam sys.indexes (Transact-SQL) . Saya tidak melihat referensi ke angka ajaib ini dan saya sangat menyarankan Anda mengarahkan penulis tutorial Anda di sini sehingga mereka dapat melihat bahwa angka ajaib ini bukanlah sesuatu yang harus mereka andalkan (apalagi mengajar orang lain untuk mengandalkan).

Aaron Bertrand
sumber
4
+1 itu kebiasaan buruk yang mengerikan. Lupakan index_id. Terutama karena data yang lebih akurat untuk menentukan jenis duduk tepat di sebelahnya ... secara harfiah.
Thomas Stringer
1
Mungkin kesalahan desain SQL Server untuk memberikan index_id dengan keteraturan ini. Mereka harus diacak sehingga tidak ada yang bisa mengandalkan mereka secara keliru.
usr
1

Menurut buku "Microsoft SQL Server 2012 Internal" Oleh Kalen Delaney, Craig Freeman, index_id indeks XML mulai penomoran dengan 256000. Jadi untuk mendapatkan semua jenis informasi indeks (query sys.indexes) tetapi melewatkan indeks XML Anda dapat menempatkan filter seperti itu.

SELECT * FROM sys.indexes WHERE index_id <256000

Set hasil yang sama dapat dicapai dengan menempatkan filter pada kolom tipe sys.indexes. Untuk tipe indeks XML, ketik = 3.

SELECT * FROM sys.indexes WHERE type <> 3

atau

Kolom type_desc juga bisa digunakan.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
aasim.abdullah
sumber
1
apakah Anda memiliki dokumentasi resmi untuk klaim ini?
swasheck
saya memilikinya di sini. halaman yang mana? juga - saya menghormati heck out dari para penulis tetapi saya tidak yakin itu dianggap sebagai "dokumentasi resmi."
swasheck
Itu adalah pengamatan biasa, paling tidak, oleh Kalen pada titik waktu tertentu, tanpa pengetahuan bahwa ini sebenarnya disengaja, apalagi kemampuan menentukan masa depan untuk menentukan apakah beberapa jenis indeks baru akan> 256000 di masa depan. Ini bukan sesuatu yang Microsoft maksudkan untuk Anda andalkan, itulah sebabnya Anda tidak akan menemukan referensi apa pun untuk itu di dokumentasi resmi. Dan setuju dengan @swasheck, sementara buku itu jelas merupakan sumber daya yang berharga, itu bukan dokumentasi resmi.
Aaron Bertrand
3
Pertanyaan @swasheck adalah itu, mengapa angka 256000 digunakan, dan bukan apa yang aman. Untuk latihan terbaik pasti saya ingin pergi dengan Harun
aasim.abdullah
1
"Apa yang dicapai ini?" Secara teknis jawabannya adalah "tidak ada." Pada dasarnya, ini adalah cara orang berkorelasi menyaring indeks XML.
swasheck