¿Qué importancia tiene un index_id <256000?

11

En cierto tutorial que leí, el autor está filtrando sys.indexessegún el predicado index_id < 256000. ¿Qué logra esto?

usr
fuente
2
Tal vez copiaron el código desys.sysindexkeys
Martin Smith
1
@ Martin Oh, qué asco.
Aaron Bertrand
1
@AaronBertrand - y también en sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexespero supongo que éstos simplemente se actualizan si el número mágico ya no es válida.
Martin Smith
1
@ Martin, no apostaría por eso. Especialmente para las vistas de compatibilidad con versiones anteriores. Qué horrible manera de demostrar cómo recuperar metadatos ...
Aaron Bertrand

Respuestas:

17

Esto se basa en la idea errónea de que los índices XML son actualmente el único tipo que podría tener un esquema de identificación que sea> = 256000 (al menos en función de su observación; este esquema no está documentado AFAIK, por lo que ni siquiera está seguro de si es intencional). Probablemente esté bien en las versiones actuales, pero ¿quién sabe qué tipo de índice se agregará a continuación y dónde comenzará su esquema de identificación? Si desea excluir índices XML, ahora también está excluyendo otra cosa. Los índices espaciales, por ejemplo, parecen comenzar en id = 384000. Si la consulta anterior tiene la intención de incluir índices espaciales pero no índices XML, se sorprenderán.

Un filtro mucho mejor sería:

WHERE type <> 3;

... o incluso mejor, ya que es autodocumentado ...

WHERE type_desc <> N'XML';

Y ahora, cuando también desea excluir, digamos, índices espaciales, su consulta cambia a ...

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

... en lugar de tener que averiguar qué rango numérico pueden ocupar (o no) los valores de id para los índices espaciales. Buena suerte con eso.

Estos están bastante claramente documentados en sys.indexes (Transact-SQL) . No veo ninguna referencia a este número mágico y le recomiendo encarecidamente que señale a su autor del tutorial aquí para que puedan ver que este número mágico no es algo en lo que deberían confiar (no importa enseñar a otros a confiar).

Aaron Bertrand
fuente
44
+1 es un mal hábito horrible. Olvídate de index_id. Especialmente porque los datos más precisos para determinar el tipo se encuentran justo al lado ... literalmente.
Thomas Stringer
1
Probablemente sea un error de diseño de SQL Server dar index_id con esta regularidad. Deben ser aleatorizados para que nadie pueda confiar erróneamente en ellos.
usr
1

De acuerdo con el libro "Microsoft SQL Server 2012 Internals" Por Kalen Delaney, Craig Freeman, index_id del índice XML comienza a numerar con 256000. Por lo tanto, para obtener toda la información de los índices de tipo (consultando sys.indexes) pero omitiendo los índices XML, puede colocar un filtro así.

SELECT * FROM sys.indexes WHERE index_id <256000

Se puede lograr el mismo conjunto de resultados colocando el filtro en la columna de tipo de sys.indexes. Para los tipos de índices XML, escriba = 3.

SELECT * FROM sys.indexes WHERE type <> 3

o

También se puede utilizar la columna type_desc.

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
aasim.abdullah
fuente
1
¿tiene documentación oficial para este reclamo?
swasheck
Lo tengo aquí mismo. ¿qué página? Además, respeto los diablos de esos autores, pero no estoy seguro de que eso cuente como "documentación oficial".
swasheck
Esa es una observación casual, en el mejor de los casos, realizada por Kalen en un punto específico en el tiempo, sin saber que esto fue realmente intencional, sin importar la capacidad de determinar el futuro para determinar si algún nuevo tipo de índice será> 256000 en el futuro. No es algo en lo que Microsoft haya querido confiar, por lo que no encontrará ninguna referencia en la documentación oficial. Y esté de acuerdo con @swasheck, aunque ese libro es definitivamente un recurso valioso, no es documentación oficial.
Aaron Bertrand
3
La pregunta de @swasheck es: ¿por qué se usa la figura 256000 y no qué es seguro? Para una mejor práctica definitivamente me gustaría ir con Aaron
aasim.abdullah
1
"¿Qué logra esto?" Técnicamente, la respuesta sería "nada". Circunstancialmente, es una forma en que las personas han correlacionado el filtrado de índices XML.
swasheck