Bir dizin_kimliği <256000'in önemi nedir?


11

Okuduğum belli bir derste yazar sys.indexesyüklemine göre filtreliyor index_id < 256000. Bu neyi başarıyor?


2
Belki kodu kopyaladılarsys.sysindexkeys
Martin Smith

1
@Martin Oh, yuck.
Aaron Bertrand

1
@AaronBertrand - ve aynı zamanda sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesama sihirli sayı artık geçerli olup olmadığını bunlar sadece güncellenecektir varsayalım.
Martin Smith

1
@Martin Ben bahse girmezdim. Özellikle geriye dönük uyumluluk görünümleri için. Meta verilerin nasıl alınacağını göstermek için ne korkunç bir yol ...
Aaron Bertrand

Yanıtlar:


17

Bu, XML dizinlerinin şu anda> = 256000 olan bir kimlik şemasına sahip olabilen tek tür olduğu yanılgısına dayanmaktadır (en azından gözlemlerine dayanmaktadır; bu şema AFAIK belgelenmemiştir, bu yüzden kasıtlı olup olmadığından bile emin değildir). Muhtemelen mevcut sürümlerde iyi, ama sonra ne tür dizin ekleneceğini ve kimlik şemasının nerede başlayacağını kim bilebilir? XML dizinlerini hariç tutmak istiyorsanız, artık başka bir şeyi de hariç tutuyorsunuz. Örneğin, uzamsal dizinler id = 384000'de başlıyor gibi görünüyor. Yukarıdaki sorgu uzamsal dizinleri içerecek, ancak XML dizinlerini içermeyecekse, sürpriz olacaklar.

Çok daha iyi bir filtre:

WHERE type <> 3;

... hatta daha da iyisi, kendi kendini belgelediği için ...

WHERE type_desc <> N'XML';

Ve şimdi, örneğin, uzamsal dizinleri de hariç tutmak istediğinizde, sorgunuz ...

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

... uzamsal dizinler için kimlik değerlerinin hangi sayısal aralığı işgal edebileceğini (veya etmeyeceğini) anlamak yerine. Bunda iyi şanslar.

Bunlar sys.indexes (Transact-SQL) içinde oldukça açık bir şekilde belgelenmiştir . Bu sihirli numaraya referans görmüyorum ve bu sihirli numaraya güvenmeleri gereken bir şey olmadığını görebilmeniz için öğretici yazarınızı buraya yönlendirmenizi şiddetle tavsiye ediyorum (başkalarına güvenmeyi öğretmeyi unutmayın).


4
+1 Bu çok kötü bir alışkanlık. Unut gitsin index_id. Özellikle, türü belirlemek için daha doğru veriler hemen yanında bulunduğundan ... kelimenin tam anlamıyla.
Thomas Stringer

1
Muhtemelen bu düzenlilikle index_id'leri vermek SQL Server'ın bir tasarım hatasıdır. Kimsenin yanlışlıkla onlara güvenemeyeceği şekilde rastgele seçilmelidirler.
usr

1

"Microsoft SQL Server 2012 Internals" kitabına göre Kalen Delaney, Craig Freeman, XML endeksinin index_id değeri 256000 ile numaralandırmaya başlar. Böylece tüm tür dizin bilgileri (sys.indexes sorgulama) almak ama XML dizinleri atlamak gibi filtre yerleştirebilirsiniz.

SELECT * FROM sys.indexes WHERE index_id <256000

Sys.indexes tür sütununa filtre yerleştirilerek aynı sonuç kümesi elde edilebilir. XML dizin türleri için = 3 yazın.

SELECT * FROM sys.indexes WHERE type <> 3

veya

type_desc sütunu da kullanılabilir.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'

1
bu iddia için resmi belgeleriniz var mı?
14'te

Tam burada var. hangi sayfa? Ayrıca - ben bu yazarların halkı saygı ama "resmi belgeler" olarak sayılır emin değilim.
14'te

Bu, en iyi ihtimalle, belirli bir noktada Kalen tarafından, bunun aslında kasıtlı olduğu hakkında hiçbir bilgiye sahip olmayan, sıradan bir gözlemdir, gelecekte yeni bir dizin türünün> 256000'den fazla olup olmayacağını belirlemek için geleceğe dair hiçbir yeteneği umursamayız. Microsoft'un güvenmesini istediği bir şey değil, bu yüzden resmi belgelerde herhangi bir referans bulamazsınız. @Swasheck ile hemfikir olun, bu kitap kesinlikle değerli bir kaynak olsa da, resmi belgeler değildir.
Aaron Bertrand

3
@swasheck sorusu, şekil 256000'in neden kullanıldığını, güvenli olanı değil. En iyi uygulama için kesinlikle ben Aaron ile dönmek istiyorum
aasim.abdullah

1
"Bu ne başarıyor?" Teknik olarak cevap "hiçbir şey" olacaktır. Koşulsuz olarak, insanların XML dizinlerini filtrelemeyi ilişkilendirmesinin bir yolu.
14'te
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.