Яке значення має index_id <256000?


11

У певному підручнику, який я читаю, автор фільтрує sys.indexesна основі присудка index_id < 256000. Що це досягає?


2
Можливо, вони скопіювали код зsys.sysindexkeys
Мартін Сміт

1
@Martin О, юк.
Аарон Бертран

1
@AaronBertrand - а також sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesале я вважаю , це не просто оновлюється , якщо магічне число більше не діє.
Мартін Сміт

1
@Martin Я не став би на це робити ставку. Особливо для зворотних поглядів сумісності. Який жахливий спосіб продемонструвати, як отримати метадані ...
Аарон Бертран

Відповіді:


17

Це ґрунтується на хибному уявленні, що в даний час індекси XML є єдиним типом, який коли-небудь може мати схему ідентифікації, яка становить> = 256000 (принаймні, виходячи з їх спостереження; ця схема не документально підтверджена AFAIK, тому навіть не впевнений, чи це навмисно). Напевно, добре в поточних версіях, але хто знає, який тип індексу буде доданий далі і звідки розпочнеться його схема id? Якщо ви хочете виключити індекси XML, тепер ви також виключаєте щось інше. Наприклад, просторові індекси, здається, починаються з id = 384000. Якщо вищевказаний запит має на меті включати просторові індекси, але не XML-індекси, їх чекає сюрприз.

Набагато кращим фільтром буде:

WHERE type <> 3;

... а ще краще, оскільки це самодокументація ...

WHERE type_desc <> N'XML';

А тепер, коли ви також хочете виключити, скажімо, просторові індекси, ваш запит змінюється на ...

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

... замість того, щоб з'ясовувати, який числовий діапазон можуть містити (або ні) значення id для просторових індексів. Удачі в цьому.

Вони досить чітко зафіксовані в sys.indexes (Transact-SQL) . Я не бачу посилання на це магічне число, і настійно рекомендую вказати тут свого підручника, щоб вони побачили, що це магічне число - це не те, на що слід покладатися (не маючи на увазі, щоб навчити інших покладатися).


4
+1 - це жахливо погана звичка. Забудь про index_id. Тим більше, що більш точні дані для визначення типу сидять поруч ... буквально.
Томас Стрінгер

1
Можливо, помилка в дизайні SQL Server видає index_id з цією регулярністю. Вони повинні бути рандомізованими, щоб ніхто не міг помилково покластися на них.
usr

1

Відповідно до книги "Microsoft SQL Server 2012 Internals" Калена Делані, Крейга Фрімана, індекс XML-індексу починається з 256000. Отже, щоб отримати всю інформацію про індекси типів (запит sys.indexes), але пропускаючи індекси XML, ви можете розмістити такий фільтр.

SELECT * FROM sys.indexes WHERE index_id <256000

Цей же набір результатів можна досягти, поставивши фільтр на стовпець типу sys.indexes. Для XML тип індексів типу = 3.

SELECT * FROM sys.indexes WHERE type <> 3

або

Стовпець type_desc також може бути використаний.

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

1
чи є у вас офіційна документація на цю претензію?
swasheck

я маю це саме тут. яка сторінка? також - я поважаю чортів цих авторів, але я не впевнений, що це вважається "офіційною документацією".
swasheck

Це випадкове спостереження, в кращому випадку від Калена в конкретний момент часу, не маючи знань, що це насправді навмисне, не маючи на увазі ніякої здатності розповідати про майбутнє, чи буде якийсь новий тип індексу> 256000 у майбутньому. Майкрософт не на те, на що ви покладалися, тому ви не знайдете жодної посилання на це в офіційній документації. І погоджуйтеся з @swasheck, хоча ця книга, безумовно, є цінним ресурсом, це не офіційна документація.
Аарон Бертран

3
Питання @swasheck полягає в тому, чому використовується цифра 256000, а не те, що є безпечним. Для найкращої практики, безумовно, я хотів би поїхати з Аароном
aasim.abdullah

1
"Що це досягає?" Технічно відповідь буде "нічого". По суті, це спосіб, за яким люди співвідносили фільтрацію індексів XML.
swasheck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.