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 インデックス
  • セカンダリ XML インデックス

xml 型の列の最初のインデックスは、プライマリ XML インデックスである必要があります。プライマリ XML インデックスを使用している場合は、PATH、VALUE、および PROPERTY という種類のセカンダリ XML インデックスがサポートされます。クエリの種類によって異なりますが、これらのセカンダリ XML インデックスを使用することで、クエリのパフォーマンス向上に役立つ場合があります。

プライマリ XML インデックス

プライマリ XML インデックスは、xml データ型の列内の XML BLOB の細分化された永続化表現です。インデックスでは、列内の XML BLOB (バイナリ ラージ オブジェクト) ごとに、数行のデータ行が作成されます。インデックス内の行数は、XML バイナリ ラージ オブジェクトのノード数とほぼ等しくなります。

各行には、次のノード情報が格納されます。

  • 要素名、属性名などのタグ名。
  • ノード値。
  • 要素ノード、属性ノード、テキスト ノードなどのノードの型。
  • ドキュメント内の表示順情報。内部ノード識別子によって表現されます。
  • 各ノードから XML ツリーのルートまでのパス。クエリ内のパス式ではこの列を検索します。
  • ベース テーブルの主キー。ベース テーブルとの逆結合のため、ベース テーブルの主キーがプライマリ XML インデックスにコピーされます。ベース テーブルの主キーの最大列数は 15 です。

このノード情報は、指定されたクエリに対して XML の結果を評価し構築するために使用されます。最適化のために、タグ名とノード型の情報は整数値でエンコードされるので、パス列でも同じエンコードを使用します。また、パスのサフィックスが既知の場合にのみパスを照合できるように、パスは逆の順序で格納されます。次に例を示します。

  • //ContactRecord/PhoneNumber : 最後の 2 つのロケーション ステップだけが既知です。

または

  • /Book/*/Title : 式の中間でワイルドカード文字 (*) が指定されています。

xml データ型メソッドに関係するクエリの場合、クエリ プロセッサでプライマリ XML インデックスが使用され、スカラ値またはプライマリ XML インデックス自体の XML サブツリーのどちらかが返されます (このプライマリ XML インデックスには XML インスタンスの再構築に必要なすべての情報が格納されています)。

たとえば、次のクエリからは ProductModel テーブルの CatalogDescriptionxml 型の列に格納された集計情報が返されます。このクエリでは、カタログの説明に <Features> の説明も含まれている製品モデルに限り <Summary> 情報が返されます。

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/PD:Features') = 1

プライマリ XML インデックスでは、ベース テーブルの各 XML バイナリ ラージ オブジェクト インスタンスを細分化するのではなく、各 XML バイナリ ラージ オブジェクトに対応するインデックスの行が exist() メソッドで指定された式に対して順番に検索されます。インデックスのパス列にそのパスが見つかると、プライマリ XML インデックスから <Summary> 要素とそのサブツリーが共に取得され、query() メソッドの結果として XML バイナリ ラージ オブジェクトに変換されます。

XML インスタンス全体を取得するときには、プライマリ XML インデックスが使用されないことに注意してください。たとえば、次のクエリでは、特定の製品モデルの製造手順を説明する XML インスタンス全体をテーブルから取得します。

USE AdventureWorks;

SELECT Instructions
FROM Production.ProductModel 
WHERE ProductModelID=7;

セカンダリ XML インデックス

検索のパフォーマンスを向上するために、セカンダリ XML インデックスを作成できます。セカンダリ XML インデックスを作成する前に、プライマリ XML インデックスが存在している必要があります。セカンダリ XML インデックスの種類を次に示します。

  • PATH セカンダリ XML インデックス
  • VALUE セカンダリ XML インデックス
  • PROPERTY セカンダリ XML インデックス

PATH セカンダリ XML インデックス

クエリで xml 型列のパス式をよく指定している場合、PATH セカンダリ インデックスにより検索速度を向上できる場合があります。このトピックで既に説明したように、WHERE 句に exist() メソッドを指定するクエリを使用する場合には、プライマリ インデックスが役に立ちます。PATH セカンダリ インデックスを追加することでも、そのようなクエリの検索パフォーマンスが向上する場合があります。

プライマリ XML インデックスにより、XML バイナリ ラージ オブジェクトを実行時に細分化せずに済むようになりますが、パス式に基づくクエリのパフォーマンスが最適にならない場合があります。XML バイナリ ラージ オブジェクトに対応するプライマリ XML インデックスのすべての行は大きな XML インスタンスに対して順番に検索されるので、検索速度が低下する場合があります。このような場合、プライマリ インデックスのパス値とノード値にセカンダリ インデックスを構築すると、インデックス検索の速度を大幅に向上できます。PATH セカンダリ インデックスではパス値とノード値がキー列になり、パスの検索時により効率的にシークできるようになります。クエリ オプティマイザでは、次に示すような式に PATH インデックスを使用できます。

  • /root/Location : パスだけを指定しています。

または

  • /root/Location/@LocationID[.="10"] : パスとノード値の両方を指定しています。

次のクエリでは、PATH インデックスが役立つケースを示します。

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

このクエリでは、exist() メソッド内のパス式 /PD:ProductDescription/@ProductModelID と値 "19" が PATH インデックスのキー フィールドに対応しています。これにより、PATH インデックス内を直接シークできるようになり、プライマリ XML インデックスでパス値を順番に検索するよりも検索のパフォーマンスが向上します。

VALUE セカンダリ XML インデックス

/Root/ProductDescription/@*[. = "Mountain Bike"] //ProductDescription[@Name = "Mountain Bike"] などのように、クエリが値に基づいており、パスが完全に指定されていない場合や、パスにワイルドカードが含まれている場合は、プライマリ XML インデックスのノード値にセカンダリ XML インデックスを構築すると、より迅速に結果を得られる場合があります。

VALUE インデックスのキー列は、プライマリ XML インデックスの列 (ノード値とパス) です。値を格納している要素名または属性名がわからない状態で XML インスタンスの値に対するクエリを実行する作業がワークロードに含まれている場合、VALUE インデックスが役立つことがあります。たとえば、次の式は VALUE インデックスを使用すると効率的になります。

  • //author[LastName="someName"] : <LastName> 要素の値はわかっていますが、親である <author> はどこにでも存在し得ます。
  • /book[@* = "someValue"] : "someValue" という値の属性を持つ <book> 要素を検索します。

次のクエリは、Contact テーブルから ContactID を返します。WHERE 句では、AdditionalContactInfoxml 型列の値を検索するフィルタを指定しています。連絡先 ID は、対応する追加の連絡先情報の XML バイナリ ラージ オブジェクトに特定の電話番号が含まれている場合にのみ返されます。<telephoneNumber> 要素は XML 内のどこにでも存在し得るので、パス式で descendent-or-self 軸を指定しています。

WITH XMLNAMESPACES (
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)

SELECT ContactID 
FROM   Person.Contact
WHERE  AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1

この場合、検索する <number> の値はわかっていますが、この値は <telephoneNumber> 要素の子として XML インスタンス内のどこにでも存在できます。このようなクエリでは特定の値に基づいてインデックス参照を行うと、効率的になる場合があります。

PROPERTY セカンダリ XML インデックス

個々の XML インスタンスから 1 つ以上の値を取得するクエリでは、PROPERTY インデックスを使用するとメリットが得られる場合があります。xml 型の value() メソッドを使用してオブジェクトのプロパティを取得する場合や、オブジェクトの主キー値が既知である場合にこのような状況が発生します。

PROPERTY インデックスは、プライマリ XML インデックスの列 (PK、パス、およびノード値) について構築されます。PK はベース テーブルの主キーです。

たとえば、次のクエリでは、製品モデル 19ProductModelID 属性と ProductModelName 属性の値を value() メソッドを使用して取得しています。プライマリ XML インデックスや他のセカンダリ XML インデックスではなく PROPERTY インデックスを使用すると、クエリをより迅速に実行できる場合があります。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') as ModelID,
       CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') as ModelName        
FROM Production.ProductModel   
WHERE ProductModelID = 19

このトピックの後半で説明する違いを除けば、xml 型列の XML インデックスは、xml 以外の型の列のインデックスと同様に作成できます。XML インデックスの作成と管理には、次の Transact-SQL DDL ステートメントを使用できます。

プライマリ XML インデックスの作成

プライマリ XML インデックスを作成するには、CREATE PRIMARY XML INDEX Transact-SQL DDL ステートメントを使用します。XML インデックスでは、XML 以外のインデックスで使用できるオプションの一部しかサポートされません。

XML インデックスの作成時には、次の事項に注意します。

  • プライマリ XML インデックスを作成するには、インデックスが作成される XML 列を含んだベース テーブルと呼ばれるテーブルの主キーに、クラスタ化インデックスが作成されている必要があります。これにより、ベース テーブルをパーティション分割した場合に、同じパーティション構成とパーティション関数を使用してプライマリ XML インデックスがパーティション分割されるようになります。
  • XML インデックスが存在する場合は、テーブルのクラスタ化主キーを変更できません。主キーを変更する前に、テーブルのすべての XML インデックスを削除する必要があります。
  • プライマリ XML インデックスは、1 つの xml 型の列に作成できます。キー列の XML 型の列には他の型のインデックスを作成できません。ただし、XML 以外のインデックスに xml 型の列を含めることはできます。テーブル内の各 xml 型列には、それぞれ独自のプライマリ XML インデックスを作成できます。ただし、各 xml 型列に作成できるプライマリ XML インデックスは 1 つだけです。
  • XML インデックスは、XML 以外のインデックスと同じ名前空間に存在します。したがって、同じテーブルでは、XML インデックスと XML 以外のインデックスを同じ名前で作成することはできません。
  • IGNORE_DUP_KEY オプションと ONLINE オプションは、XML インデックスでは常に OFF に設定されます。これらのオプションを値 OFF で指定できます。
  • ユーザー テーブルのファイル グループ情報またはパーティション分割情報が XML インデックスに適用されます。ユーザーは、これらの情報を XML インデックスで別々に指定することはできません。
  • DROP_EXISTING インデックス オプションを使用すると、プライマリ XML インデックスを削除して新しい XML インデックスを作成することや、セカンダリ XML インデックスを削除して新しいセカンダリ XML インデックスを作成することができます。ただし、このインデックス オプションを使用して、セカンダリ XML インデックスを削除して新しいプライマリ XML インデックスを作成することや、プライマリ XML インデックスを削除して新しいセカンダリ XML インデックスを作成することはできません。
  • プライマリ XML インデックスの名前にはビュー名と同じ制限事項が適用されます。

ビューの xml 型の列、xml 型の列が含まれた table 値変数、または xml 型の変数には XML インデックスを作成することはできません。

  • ALTER TABLE ALTER COLUMN オプションを使用して、xml 型の列を型指定されていない XML から型指定された XML に変更する場合、またはその逆の変更を行う場合は、その列に XML インデックスが存在してはいけません。XML インデックスが存在する場合は、列の型を変更する前にその XML インデックスを削除する必要があります。
  • XML インデックスを作成する場合は、ARITHABORT オプションが ON に設定されている必要があります。XML 列内の値を XML データ型メソッドを使用してクエリ、挿入、削除、または更新するには、同じオプションがその接続に設定される必要があります。異なるオプションが設定された場合、XML データ型のメソッドは失敗します。
    ms191497.note(ja-jp,SQL.90).gifメモ :
    XML インデックスについての情報は、カタログ ビューで参照できます。ただし、sp_helpindex はサポートされません。このトピックの後半に示す例では、カタログ ビューをクエリして XML インデックスの情報を参照する方法を説明しています。

セカンダリ XML インデックスの作成

CREATE INDEX Transact-SQL DDL ステートメントを使用すると、セカンダリ XML インデックスを作成することや、セカンダリ XML インデックスの種類を指定することができます。

セカンダリ XML インデックスの作成時には、次の事項に注意します。

  • IGNORE_DUP_KEY と ONLINE を除き、非クラスタ化インデックスに適用されるすべてのオプションをセカンダリ XML インデックスで使用できます。例外の 2 つのオプションは、セカンダリ XML インデックスでは常に OFF に設定する必要があります。
  • セカンダリ XML インデックスは、プライマリ XML インデックスと同様にパーティション分割されます。
  • DROP_EXISTING を使用すると、ユーザー テーブルのセカンダリ XML インデックスを削除し、そのユーザー テーブルに別のセカンダリ XML インデックスを作成できます。

sys.xml_indexes カタログ ビューにクエリを実行して XML インデックス情報を取得できます。sys.xml_indexes カタログ ビューの seconday_type_desc 列には、セカンダリ インデックスの種類が示されます。

SELECT  * 
FROM    sys.xml_indexes

seconday_type_desc 列に返される値は、NULL、PATH、VALUE、または PROPERTY です。プライマリ XML インデックスの場合、返される値は NULL です。

XML インデックスの変更

ALTER INDEX Transact-SQL DDL ステートメントを使用して既存の XML インデックスや XML 以外のインデックスを変更できます。ただし、一部の ALTER INDEX オプションは XML インデックスに使用できません。次のオプションは、XML インデックスの変更時には無効です。

  • 再構築と設定オプションの IGNORE_DUP_KEY は XML インデックスでは無効です。再構築オプション ONLINE は、セカンダリ XML インデックスでは OFF に設定されている必要があります。オプション DROP_EXISTING は、ALTER INDEX ステートメントでは使用できません。インデックスを再構築する場合、接続オプションを「オプションの設定 (XML インデックス)」で説明しているとおりに設定する必要があります。
  • ユーザー テーブルの主キー制約に変更があった場合、自動的には XML インデックスに反映されません。ユーザーが、まず XML インデックスを削除し、次に XML インデックスを再作成する必要があります。
  • ALTER INDEX ALL を指定すると、このオプションは XML 以外のインデックスと XML インデックスの両方に適用されます。一方の種類のインデックスでは無効なインデックス オプションが指定される場合があります。その場合、ステートメント全体が失敗します。

XML インデックスの削除

DROP INDEX Transact-SQL ステートメントを使用すると、XML インデックスと XML 以外のインデックスの両方を含め、既存のプライマリ インデックスまたはセカンダリ インデックスを削除できます。ただし、DROP INDEX のオプションは XML インデックスに適用されません。プライマリ XML インデックスを削除すると、存在するセカンダリ XML インデックスもすべて削除されます。

TableName**.**IndexName を指定する DROP 構文は廃止されるので、XML インデックスではサポートされません。

次の例では、XML インデックスの作成、変更、および削除を示します。

A. プライマリ XML インデックスの作成と削除

次の例では、xml 型の列に XML インデックスを作成します。

DROP TABLE T
GO
CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
-- Create Primary XML index 
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlCol)
GO
-- Verify the index creation. 
-- Note index type is 3 for xml indexes.
-- Note the type 3 is index on XML type.
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')
AND name='PIdx_T_XmlCol' 
-- Drop the index.
DROP INDEX PIdx_T_XmlCol ON T

テーブルを削除すると、テーブルのすべての XML インデックスも自動的に削除されます。ただし、XML 列に XML インデックスが存在する場合、その XML 列はテーブルから削除できません。

次の例では、xml 型の列に XML インデックスを作成します。詳細については、「型指定された XML と型指定されていない XML」を参照してください。

CREATE TABLE TestTable(
 Col1 int primary key, 
 Col2 xml (Production.ProductDescriptionSchemaCollection)) 
GO

これで次のように、Co12 にプライマリ XML インデックスを作成できます。

CREATE PRIMARY XML INDEX PIdx_TestTable_Col2 
ON TestTable(Col2)
GO

B. セカンダリ XML インデックスの作成

次の例では、セカンダリ XML インデックスの作成方法を示します。また、作成した XML インデックスに関する情報も示します。

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
-- Create primary index.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlCol)
GO
-- Create secondary indexes (PATH, VALUE, PROPERTY).
CREATE XML INDEX PIdx_T_XmlCol_PATH ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PATH
GO
CREATE XML INDEX PIdx_T_XmlCol_VALUE ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR VALUE
GO
CREATE XML INDEX PIdx_T_XmlCol_PROPERTY ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PROPERTY
GO

sys.xml_indexes に対するクエリを実行して XML インデックス情報を取得できます。secondary_type_desc 列からは、セカンダリ インデックスの種類が提供されます。

SELECT  * 
FROM    sys.xml_indexes

次のように、カタログ ビューに対するクエリを実行してインデックス情報を取得することもできます。

SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')

次のように、サンプル データを追加した後で、XML インデックス情報を確認できます。

INSERT INTO T VALUES (1,
'<doc id="123">
<sections>
<section num="2">
<heading>Background</heading>
</section>
<section num="3">
<heading>Sort</heading>
</section>
<section num="4">
<heading>Search</heading>
</section>
</sections>
</doc>')
GO
-- Check XML index information.
SELECT *
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, NULL, 'DETAILED')
GO
-- Space usage of primary XML index
DECLARE @index_id int
SELECT  @index_id = i.index_id
FROM    sys.xml_indexes i 
WHERE   i.name = 'PIdx_T_XmlCol' and object_name(i.object_id) = 'T'
 
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED')
go
--- Space usage of secondary XML index (for example PATH secondary index)  PIdx_T_XmlCol_PATH
DECLARE @index_id int
SELECT  @index_id = i.index_id 
FROM    sys.xml_indexes i 
WHERE  i.name = 'PIdx_T_XmlCol_PATH' and object_name(i.object_id) = 'T'
 
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED')
go
 
-- Space usage of all secondary XML indexes for a particular table
SELECT i.name, object_name(i.object_id), stats.* 
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, DEFAULT, 'DETAILED') stats
JOIN sys.xml_indexes i ON (stats.object_id = i.object_id and stats.index_id = i.index_id)
WHERE secondary_type is not null
-- Drop secondary indexes.
DROP INDEX PIdx_T_XmlCol_PATH ON T
GO
DROP INDEX PIdx_T_XmlCol_VALUE ON T
GO
DROP INDEX PIdx_T_XmlCol_PROPERTY ON T
GO
-- Drop primary index.
DROP INDEX PIdx_T_XmlCol ON T
-- Drop table T.
DROP TABLE T
Go

C. XML インデックスの変更

次の例では、XML インデックスを作成後、ALLOW_ROW_LOCKS オプションを OFF に設定してインデックスを変更します。ALLOW_ROW_LOCKSOFF の場合、行はロックされないので、ページレベルおよびテーブルレベルのロックを使用して、指定したインデックスにアクセスできます。

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
-- Create primary XML index. 
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlCol)
GO
-- Note the type 3 is index on XML type.
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')
AND name='PIdx_T_XmlCol'

-- Modify and set an index option.
ALTER INDEX PIdx_T_XmlCol on T 
SET (ALLOW_ROW_LOCKS = OFF)

D. XML インデックスの無効化と有効化

既定では、XML インデックスは有効です。XML が無効になっている場合、その XML 列に実行されるクエリでは XML インデックスが使用されません。XML インデックスを有効にするには、REBUILD オプションを指定した ALTER INDEX を使用します。

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
CREATE PRIMARY XML INDEX PIdx_T_XmlCol ON T(XmlCol)
GO
ALTER INDEX PIdx_T_XmlCol on T DISABLE
Go
-- Verify index is disabled.
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')
AND name='PIdx_T_XmlCol'
-- Rebuild the index.
ALTER INDEX PIdx_T_XmlCol on T REBUILD
Go

E. DROP_EXISTING インデックス オプションを使用した XML インデックスの作成

次の例では、列 (XmlColx) に XML インデックスを作成しています。次に、同じ名前を使用して異なる列 (XmlColy) に別の XML インデックスを作成します。DROP_EXISTING を指定しているので、列 (XmlColx) の既存の XML インデックスが削除されて、列 (XmlColy) に新しい XML インデックスが作成されます。

DROP TABLE T
GO
CREATE TABLE T(Col1 int primary key, XmlColx xml, XmlColy xml)
GO
-- Create XML index on XmlColx.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlColx)
GO
-- Create same name XML index on XmlColy.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlColy) 
WITH (DROP_EXISTING = ON)
-- Verify the index is created on XmlColy.d.
SELECT sc.name 
FROM   sys.xml_indexes si inner join sys.index_columns sic 
ON     sic.object_id=si.object_id and sic.index_id=si.index_id
INNER  join sys.columns sc on sc.object_id=sic.object_id 
AND    sc.column_id=sic.column_id
WHERE  si.name='PIdx_T_XmlCol' 
AND    si.object_id=object_id('T')

このクエリからは、指定した XML インデックスを作成する対象の列名が返されます。

参照

概念

xml データ型
サンプル XML アプリケーション

その他の技術情報

sys.dm_db_index_physical_stats

ヘルプおよび情報

SQL Server 2005 の参考資料の入手