Che significato ha un index_id <256000?


11

In un certo tutorial ho letto che l'autore sta filtrando in sys.indexesbase al predicato index_id < 256000. Cosa compie questo?


2
Forse hanno copiato il codice dasys.sysindexkeys
Martin Smith il

1
@Martin Oh, schifo.
Aaron Bertrand

1
@AaronBertrand - ed anche in sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesma suppongo che queste saranno solo vengono aggiornati se il numero magico non è più valido.
Martin Smith,

1
@Martin Non ci scommetterei. Soprattutto per le visualizzazioni di compatibilità con le versioni precedenti. Che modo orribile di dimostrare come recuperare i metadati ...
Aaron Bertrand

Risposte:


17

Questo si basa sul malinteso secondo cui gli indici XML sono attualmente l'unico tipo che potrebbe mai avere uno schema id che è> = 256000 (almeno basato sulla loro osservazione; questo schema non è documentato AFAIK, quindi non sono nemmeno sicuro che sia intenzionale). Probabilmente va bene nelle versioni attuali, ma chissà quale tipo di indice verrà aggiunto successivamente e da dove inizierà il suo schema id? Se vuoi escludere gli indici XML, ora stai escludendo anche qualcos'altro. Gli indici spaziali, ad esempio, sembrano iniziare con id = 384000. Se la query sopra intende includere indici spaziali ma non indici XML, saranno sorpresi.

Un filtro molto migliore sarebbe:

WHERE type <> 3;

... o meglio, dato che si documenta da solo ...

WHERE type_desc <> N'XML';

E ora, quando si desidera escludere, per esempio, indici spaziali, la query cambia in ...

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

... invece di dover capire quale intervallo numerico i valori id per gli indici spaziali potrebbero occupare (o meno). Buona fortuna.

Questi sono abbastanza chiaramente documentati in sys.indexes (Transact-SQL) . Non vedo alcun riferimento a questo numero magico e consiglio vivamente di puntare qui l'autore del tutorial in modo che possano vedere che questo numero magico non è qualcosa su cui dovrebbero fare affidamento (non importa di insegnare agli altri a fare affidamento).


4
+1 è una cattiva abitudine. Dimentica index_id. Soprattutto perché dati più precisi per determinare il tipo si trovano proprio accanto ad esso ... letteralmente.
Thomas Stringer,

1
Probabilmente è un errore di progettazione di SQL Server distribuire index_id con questa regolarità. Dovrebbero essere randomizzati in modo che nessuno possa erroneamente fare affidamento su di essi.
usr

1

Secondo il libro "Microsoft SQL Server 2012 Internals" di Kalen Delaney, Craig Freeman, l'indice_id dell'indice XML inizia la numerazione con 256000. Quindi per ottenere tutte le informazioni sugli indici di tipo (interrogando sys.indexes) ma saltando gli indici XML è possibile posizionare un filtro simile.

SELECT * FROM sys.indexes WHERE index_id <256000

Lo stesso set di risultati può essere ottenuto posizionando il filtro sulla colonna type di sys.indexes. Per tipo di indice XML tipo = 3.

SELECT * FROM sys.indexes WHERE type <> 3

o

È possibile utilizzare anche la colonna type_desc.

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

1
hai documentazione ufficiale per questo reclamo?
sweckeck,

ce l'ho proprio qui. quale pagina? inoltre, rispetto il diavolo di quegli autori, ma non sono sicuro che valga come "documentazione ufficiale".
sweckeck,

Questa è un'osservazione casuale, nella migliore delle ipotesi, di Kalen in un determinato momento, senza la consapevolezza che ciò fosse effettivamente intenzionale, non importa se nessuna capacità futura di determinare se un nuovo tipo di indice sarà> 256000 in futuro. Non è qualcosa su cui Microsoft intendeva fare affidamento, motivo per cui non troverai alcun riferimento nella documentazione ufficiale. E d'accordo con @swasheck, mentre quel libro è sicuramente una risorsa preziosa, non è una documentazione ufficiale.
Aaron Bertrand

3
La domanda di @swasheck è quella, perché viene usata la figura 256000 e non ciò che è sicuro. Per la migliore pratica sicuramente vorrei andare con Aaron
aasim.abdullah il

1
"Che cosa compie questo?" Tecnicamente la risposta sarebbe "niente". In sostanza, è un modo in cui le persone hanno correlato il filtraggio degli indici XML.
swasheck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.