特定のチュートリアルで私が読んだのはsys.indexes
、述語に基づいたフィルタリングですindex_id < 256000
。これは何を達成しますか?
sys.selective_xml_index_paths
、sys.xml_indexes
、sys.sysindexes
私はマジックナンバーがもはや有効であれば、これらは単に更新されなかったとしてしまいます。
特定のチュートリアルで私が読んだのはsys.indexes
、述語に基づいたフィルタリングですindex_id < 256000
。これは何を達成しますか?
sys.selective_xml_index_paths
、sys.xml_indexes
、sys.sysindexes
私はマジックナンバーがもはや有効であれば、これらは単に更新されなかったとしてしまいます。
回答:
これは、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)にかなり明確に文書化されています。このマジックナンバーへの言及はありません。このマジックナンバーが依存すべきものではないことがわかるように、チュートリアルの作成者をここに紹介することを強くお勧めします(他のユーザーに依存するように教えないでください)。
index_id
。特に、タイプを決定するためのより正確なデータがすぐ隣にあるので...文字通りです。
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'
sys.sysindexkeys