XML データ型の列のインデックス
xml データ型の列には XML インデックスを作成できます。列に保存されている XML インスタンスのすべてのタグ、値、およびパスにインデックスが設定されるので、クエリのパフォーマンスが向上します。次のような場合、XML インデックスの効果が得られる可能性があります。
ワークロードで XML 列へのクエリが頻繁に行われる場合。データ変更時の XML インデックスのメンテナンス コストを考慮する必要があります。
XML 値が比較的大きいのに対し、取得する部分が比較的小さい場合。インデックスを作成すると、実行時にデータ全体が解析されることを回避し、クエリ処理を効率化するためのインデックス参照を利用できます。
XML のインデックスは、次のカテゴリに分類されます。
プライマリ XML インデックス
セカンダリ XML インデックス
xml 型の列の最初のインデックスは、プライマリ XML インデックスである必要があります。プライマリ XML インデックスを使用している場合は、PATH、VALUE、および PROPERTY という種類のセカンダリ XML インデックスがサポートされます。クエリの種類によって異なりますが、これらのセカンダリ XML インデックスを使用することで、クエリのパフォーマンス向上に役立つ場合があります。
注意 |
---|
XML インデックスを作成したり変更したりするには、xml データ型を操作できるようにデータベース オプションが正しく設定されている必要があります。詳細については、「XML 列のフルテキスト インデックス」を参照してください。 |
XML インスタンスは、BLOB (バイナリ ラージ オブジェクト) として xml 型の列に格納されます。これらの XML インスタンスは大きくなる可能性がありますが、xml データ型インスタンスをバイナリ表記したものを最大 2 GB まで格納できます。インデックスを設定しない場合、クエリを評価するためにこのようなバイナリ ラージ オブジェクトが実行時に細分化されます。この細分化には時間がかかる場合があります。たとえば、次のクエリについて考えてみます。
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1
WHERE 句の条件を満たす XML インスタンスを選択するために、テーブル Production.ProductModel の各行内の XML BLOB (バイナリ ラージ オブジェクト) が実行時に細分化されます。次に、exist() メソッドの式 (/PD:ProductDescription/@ProductModelID[.="19"]) が評価されます。このような実行時の細分化は、列に格納されたインスタンスのサイズや数によってはコストが高くなる場合があります。
使用しているアプリケーション環境で、XML BLOB (バイナリ ラージ オブジェクト) に対するクエリを頻繁に実行する場合は、xml 型の列のインデックスを設定することが役に立ちます。ただし、データの変更時には、インデックスのメンテナンスに関するコストがかかります。
このセクションの内容
トピック |
内容 |
---|---|
プライマリ XML インデックスとその行について説明します。 |
|
セカンダリ XML インデックスの 3 つの種類について説明します。 |
|
プライマリ インデックスとセカンダリ インデックスの作成方法について説明します。 |
|
ALTER INDEX ステートメントを使用して XML インデックスを変更する方法について説明します。 |
|
DROP INDEX ステートメントを使用してインデックスを削除する方法について説明します。 |
|
XML 列にフルテキスト インデックスを作成する方法について説明します。 |