Какое значение имеет index_id <256000?

11

В определенном уроке, который я прочитал, автор выполняет фильтрацию sys.indexesна основе предиката index_id < 256000. Что это делает?

USR
источник
2
Может быть, они скопировали код изsys.sysindexkeys
Martin Smith
1
@ Мартин Ох, чёрт.
Аарон Бертран
1
@AaronBertrand - а также sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesно я полагаю , это не просто обновляется , если магическое число больше не действует.
Мартин Смит
1
@ Мартин, я бы на это не ставил. Специально для обратной совместимости просмотров. Какой ужасный способ продемонстрировать, как получить метаданные ...
Аарон Бертран

Ответы:

17

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

Гораздо лучший фильтр будет:

WHERE type <> 3;

... или даже лучше, так как это самодокументируется ...

WHERE type_desc <> N'XML';

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

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

... вместо того, чтобы выяснить, какой числовой диапазон могут занимать значения идентификаторов для пространственных индексов (или нет). Удачи с этим.

Они довольно четко задокументированы в sys.indexes (Transact-SQL) . Я не вижу ссылки на это магическое число, и я настоятельно рекомендую вам указать здесь вашего учебника, чтобы они могли видеть, что на это магическое число не следует полагаться (не говоря уже о том, чтобы научить других полагаться).

Аарон Бертран
источник
4
+1 это ужасно плохая привычка. Забудь о index_id. Тем более, что более точные данные для определения типа находятся прямо рядом с ним ... буквально.
Томас Стрингер
1
Вероятно, это ошибка разработки SQL Server для выдачи index_id с такой регулярностью. Они должны быть рандомизированы, чтобы никто не мог ошибочно полагаться на них.
USR
1

Согласно книге «Внутренние компоненты Microsoft SQL Server 2012» Калена Делани, Крейг Фриман, index_id индекса 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'
aasim.abdullah
источник
1
у вас есть официальная документация по этой претензии?
swasheck
у меня это прямо здесь какая страница? Кроме того, я уважаю этих авторов, но я не уверен, что это считается «официальной документацией».
swasheck
Это случайное наблюдение, в лучшем случае, Калена в определенный момент времени, не зная, что это было на самом деле преднамеренно, не говоря уже о способности говорить о будущем, чтобы определить, будет ли какой-то новый тип индекса> 256000 в будущем. Microsoft не собиралась на это полагаться, поэтому вы не найдете ссылки на нее в официальной документации. И согласитесь с @swasheck, хотя эта книга, безусловно, является ценным ресурсом, она не является официальной документацией.
Аарон Бертран
3
Вопрос @swasheck в том, почему используется цифра 256000, а не то, что безопасно. Для лучшей практики определенно я хотел бы пойти с Аароном
aasim.abdullah
1
"Что это делает?" Технически ответом будет «ничего». По сути, это способ, которым люди связывают фильтрацию XML-индексов.
swasheck