index_id <256000にはどのような意味がありますか?


11

特定のチュートリアルで私が読んだのはsys.indexes、述語に基づいたフィルタリングですindex_id < 256000。これは何を達成しますか?


2
多分彼らはからコードをコピーしましたsys.sysindexkeys
マーティン・スミス14

1
@マーティンああ、いや。
アーロンバートランド

1
@AaronBertrand -ともでsys.selective_xml_index_pathssys.xml_indexessys.sysindexes私はマジックナンバーがもはや有効であれば、これらは単に更新されなかったとしてしまいます。
マーティン・スミス

1
@マーティン私はそれに賭けません。特に下位互換性の観点から。メタデータを取得する方法を示すための恐ろしい方法...
Aaron Bertrand

回答:


17

これは、XMLインデックスが現在256000以上のidスキームを持つ可能性がある唯一のタイプであるという誤解に基づいています(少なくともそれらの観察に基づいています。このスキームは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。特に、タイプを決定するためのより正確なデータがすぐ隣にあるので...文字通りです。
Thomas Stringer

1
この規則性を備えたindex_idを提供するのは、おそらくSQL Serverの設計エラーです。誰もが誤ってそれらに依存できないように、それらはランダム化されるべきです。
usrは

1

Craig Freeman著Kalen Delaney著の本「Microsoft SQL Server 2012 Internals」によると、XMLインデックスのindex_idは256000から始まります。すべてのタイプのインデックス情報を取得するには(sys.indexesのクエリ)、XMLインデックスをスキップしてそのようなフィルターを配置できます。

SELECT * FROM sys.indexes WHERE index_id <256000

同じ結果セットは、sys.indexesのtype列にフィルターを配置することで実現できます。インデックスのXMLタイプの場合、タイプ= 3。

SELECT * FROM sys.indexes WHERE type <> 3

または

type_desc列も使用できます。

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

1
この申し立ての公式文書はありますか?
swasheck

ここにあります。どのページ?また、私はそれらの作者の一体を尊重しますが、それが「公式ドキュメント」としてカウントされるかどうかはわかりません。
swasheck 14

これは、特定の時点でのKalenによるせいぜい偶然の観察であり、これが実際に意図的なものであるという知識はなく、新しいインデックスタイプが将来256000を超えるかどうかを判断する将来の通知機能を気にしないでください。これは、Microsoftが信頼することを意図したものではありません。そのため、公式ドキュメントに参照が記載されていません。@swasheckにも同意してください。その本は間違いなく貴重なリソースですが、公式のドキュメントではありません。
アーロンバートランド

3
@swasheckの質問は、図256000が使用される理由であり、安全なものではありません。ベストプラクティスのために、アーロンと一緒に行きたいと思います
aasim.abdullah

1
「これで何ができるの?」技術的には答えは「何もない」でしょう。状況に応じて、これは人々がXMLインデックスをフィルターで除外する方法です。
swasheck 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.