XML データ型と列 (SQL Server)XML Data Type and Columns (SQL Server)

適用対象: ○SQL Server XAzure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、 での xml SQL ServerSQL Serverデータ型を使用する利点と制限および、XML データを保存する方法の正しい選択について説明します。This topic discusses the advantages and the limitations of the xml data type in SQL ServerSQL Server, and helps you to choose how to store XML data.

リレーショナル データ モデルと XML データ モデルRelational or XML Data Model

使用するデータが既知のスキーマにより十分に構造化されている場合、データ ストレージとしてはリレーショナル モデルが最適です。If your data is highly structured with known schema, the relational model is likely to work best for data storage. SQL ServerSQL Server に用意されています。provides the required functionality and tools you may need. ただし、データが構造化されていないか構造化が部分的である場合、または構造化の状態が不明な場合は、データのモデリングを検討する必要があります。On the other hand, if the structure is semi-structured or unstructured, or unknown, you have to give consideration to modeling such data.

構造や意味によるマークアップを行ってデータを移行できるようにするために、プラットフォームに依存しないモデルが必要な場合、XML が適しています。XML is a good choice if you want a platform-independent model in order to ensure portability of the data by using structural and semantic markup. また、次に示す条件に該当する場合も XML が適切です。Additionally, it is an appropriate option if some of the following properties are satisfied:

  • データの密度が低いか構造が不明な場合。または将来のデータの構造が大きく変わる可能性がある場合。Your data is sparse or you do not know the structure of the data, or the structure of your data may change significantly in the future.

  • データがエンティティ間の参照ではなく包含階層を成していて、再帰的な性質がある場合。Your data represents containment hierarchy, instead of references among entities, and may be recursive.

  • データの順序が固定している場合。Order is inherent in your data.

  • データの構造を基にして、データへのクエリやデータの部分的な更新を行う場合。You want to query into the data or update parts of it, based on its structure.

上記の条件のいずれにも該当しない場合は、リレーショナル データ モデルを使用してください。If none of these conditions is met, you should use the relational data model. たとえば、データが XML 形式であってもデータの格納と取得にしかデータベースを使用しない場合、 [n]varchar(max) 列で十分です。For example, if your data is in XML format but your application just uses the database to store and retrieve the data, an [n]varchar(max) column is all you require. XML 列にデータを格納すると、それ以外の利点があります。Storing the data in an XML column has additional benefits. たとえば、データが適切な形式であり有効であることをデータベース エンジンで判断できることや、XML データに対するきめ細かいクエリや更新がサポートされることなどです。This includes having the engine determine that the data is well formed or valid, and also includes support for fine-grained query and updates into the XML data.

SQL Server で XML データを保存する理由Reasons for Storing XML Data in SQL Server

次に、ファイル システムによる XML データの管理ではなく、 SQL ServerSQL Server のネイティブ XML 機能を使用する理由を示します。Following are some of the reasons to use native XML features in SQL ServerSQL Server instead of managing your XML data in the file system:

  • XML データの共有、クエリ、および変更をトランザクション方式で効率的に行うため。You want to share, query, and modify your XML data in an efficient and transacted way. アプリケーションにとって、きめ細かいデータ アクセスは重要です。Fine-grained data access is important to your application. たとえば、XML ドキュメントのセクションの一部を抽出したり、ドキュメント全体を置き換えることなく新しいセクションを挿入することができます。For example, you may want to extract some of the sections within an XML document, or you may want to insert a new section without replacing your whole document.

  • リレーショナル データと XML データがあり、アプリケーションで双方のデータ間の相互運用性が必要なため。You have relational data and XML data and you want interoperability between both relational and XML data within your application.

  • XML とリレーショナルの 2 つの領域にまたがるアプリケーションで、クエリやデータ変更に対する言語サポートが必要なため。You need language support for query and data modification for cross-domain applications.

  • データが整形式であることの保証、および必要に応じて XML スキーマに従ったデータの検証をサーバーで行うため。You want the server to guarantee that the data is well formed and also optionally validate your data according to XML schemas.

  • クエリの処理を効率化し、スケーラビリティを高めるため XML データにインデックスを設定し、特に優れたクエリ オプティマイザーを使用するため。You want indexing of XML data for efficient query processing and good scalability, and the use of a first-rate query optimizer.

  • SOAP、ADO.NET、および OLE DB で XML データにアクセスするため。You want SOAP, ADO.NET, and OLE DB access to XML data.

  • XML データの管理にデータベース サーバーの管理機能を使用するため。You want to use administrative functionality of the database server for managing your XML data. たとえば、バックアップ、復旧、およびレプリケーションなどです。For example, this would be backup, recovery, and replication.

上記の条件のいずれにも該当しない場合、XML 以外のラージ オブジェクト型 ( [n]varchar(max)varbinary(max) など) でデータを保存するのが適切です。If none of these conditions is satisfied, it may be better to store your data as a non-XML, large object type, such as [n]varchar(max) or varbinary(max).

XML ストレージ オプションXML Storage Options

次に、 SQL ServerSQL Server での XML のストレージ オプションを示します。The storage options for XML in SQL ServerSQL Server include the following:

  • xml データ型としてのネイティブ ストレージNative storage as xml data type

    データの XML コンテンツを保持できる内部表現を使用してデータが保存されます。The data is stored in an internal representation that preserves the XML content of the data. 内部表現には、包含階層、表示順、要素や属性の値に関する情報などがあります。This internal representation includes information about the containment hierarchy, document order, and element and attribute values. 具体的には、XML データの InfoSet コンテンツが保持されます。Specifically, the InfoSet content of the XML data is preserved. InfoSet の詳細については、「http://www.w3.org/TR/xml-infoset」を参照してください。For more information about InfoSet, visit http://www.w3.org/TR/xml-infoset. InfoSet コンテンツでは、重要でない空白文字、属性の順序、名前空間プレフィックス、および XML 宣言が保持されないので、テキスト形式の XML のまったく同一のコピーにはならない場合があります。The InfoSet content may not be an identical copy of the text XML, because the following information is not retained: insignificant white spaces, order of attributes, namespace prefixes, and XML declaration.

    型指定された xml データ型、つまり XML スキーマにバインドされた xml データ型の場合、PSVI (スキーマ検証後の InfoSet) によって型情報が InfoSet に追加され、内部表現にエンコードされます。For typed xml data type, an xml data type bound to XML schemas, the post-schema validation InfoSet (PSVI) adds type information to the InfoSet and is encoded in the internal representation. その結果、解析速度が大幅に向上します。This improves parsing speed significantly. 詳細については、http://www.w3.org/TR/xmlschema-1http://www.w3.org/TR/xmlschema-2 で W3C の XML スキーマの仕様を参照してください。For more information, see the W3C XML Schema specifications at http://www.w3.org/TR/xmlschema-1 and http://www.w3.org/TR/xmlschema-2.

  • XML ストレージとリレーショナル ストレージのマッピングMapping between XML and relational storage

    AXSD (注釈付きスキーマ) を使用することで、XML は 1 つ以上のテーブルの複数の列に分解されます。By using an annotated schema (AXSD), the XML is decomposed into columns in one or more tables. 分解されても、リレーショナル レベルでのデータの忠実性は保たれます。This preserves fidelity of the data at the relational level. したがって、要素間の順序は無視されますが階層構造は保持されます。As a result, the hierarchical structure is preserved although order among elements is ignored. 再帰的なスキーマは使用できません。The schema cannot be recursive.

  • ラージ オブジェクト ストレージ、 [n]varchar(max)varbinary(max)Large object storage, [n]varchar(max) and varbinary(max)

    データの完全なコピーが保存されます。An identical copy of the data is stored. これは、法務文書など、特殊な用途に使用します。This is useful for special-purpose applications such as legal documents. ほとんどの場合、正確なコピーは不要であり、XML コンテンツ (InfoSet レベルの忠実性) で十分です。Most applications do not require an exact copy and are satisfied with the XML content (InfoSet fidelity).

一般的には、上記のいくつかの方法を組み合わせることができます。Generally, you may have to use a combination of these approaches. たとえば、 xml データ型の列に XML データを保存して、列のプロパティをリレーショナル列に昇格させることができます。For example, you may want to store your XML data in an xml data type column and promote properties from it into relational columns. または、再帰しない部分を XML 以外の列に格納し、再帰部分のみを xml データ型の列に格納するためにマッピング テクノロジを使用することができます。Or, you may want to use mapping technology to store nonrecursive parts in non-XML columns and only the recursive parts in xml data type columns.

XML テクノロジの選択Choice of XML Technology

ネイティブ XML と XML ビューのどちらの XML テクノロジを選択するかは、主に次の要因によって決まります。The choice of XML technology, native XML versus XML view, generally depends upon the following factors:

  • ストレージ オプションStorage options

    XML データは、ラージ オブジェクトとして保存するのが適切な場合 (製品マニュアルなど) と、リレーショナル列に保存するのに向いている場合 (XML に変換した商品品目など) があります。Your XML data may be more appropriate for large object storage (for example, a product manual), or more amenable to storage in relational columns (for example, a line item converted to XML). それぞれのストレージ オプションで保持される忠実性の度合いが異なります。Each storage option preserves document fidelity to a different extent.

  • クエリ機能Query capabilities

    クエリの性質およびクエリの対象になる XML データの範囲を基に、最適なストレージ オプションがわかる場合があります。You may find one storage option more appropriate than another, based on the nature of your queries and on the extent to which you query your XML data. XML ノードの述語評価など、XML データへのきめ細かいクエリは、2 つのストレージ オプションでのサポートの度合いに差があります。Fine-grained query of your XML data, for example, predicate evaluation on XML nodes, is supported to varying degrees in the two storage options.

  • XML データのインデックス設定Indexing XML data

    XML クエリのパフォーマンスを向上するために、XML データにインデックスを設定できます。You may want to index the XML data to speed up XML query performance. インデックス設定のオプションはストレージ オプションによって異なります。ワークロードを最小にするために、適切な選択を行う必要があります。Indexing options vary with the storage options; you have to make the appropriate choice to optimize your workload.

  • データ変更機能Data modification capabilities

    一部のワークロードは、XML データのきめ細かい変更を伴います。Some workloads involve fine-grained modification of XML data. たとえば、ドキュメント内に新しいセクションを追加する場合などが該当しますが、Web コンテンツなどのその他のワークロードではこのような変更はありません。For example, this can include adding a new section within a document, while other workloads, such as Web content, do not. アプリケーションで、データ変更言語のサポートが重要になる場合があります。Data modification language support may be important for your application.

  • スキーマのサポートSchema support

    XML データは、スキーマを使用して記述できる場合があります。このときのスキーマは、XML スキーマ ドキュメントであっても、そうでなくてもかまいません。Your XML data may be described by a schema that may or may not be an XML schema document. スキーマにバインドされた XML がサポートされるかどうかは、XML テクノロジによって異なります。The support for schema-bound XML depends upon the XML technology.

どの選択肢を選ぶかで、パフォーマンス特性が異なります。Different choices also have different performance characteristics.

ネイティブ XML ストレージNative XML Storage

XML データを、サーバーの xml データ型の列に保存できます。You can store your XML data in an xml data type column at the server. 次の条件に該当する場合、この方法が適しています。This is an appropriate choice if the following applies:

  • 簡単にサーバーに XML データを保存すると同時に、表示順やドキュメント構造を保持する場合。You want a straightforward way to store your XML data at the server and, at the same time, preserve document order and document structure.

  • XML データのスキーマがあるかどうかが明確でない場合。You may or may not have a schema for your XML data.

  • XML データに対し、クエリや変更を行う場合。You want to query and modify your XML data.

  • クエリ処理を高速化するために XML データにインデックスを設定する場合。You want to index the XML data for faster query processing.

  • XML データと XML スキーマを管理するためのシステム カタログ ビューが必要な場合。Your application needs system catalog views to administer your XML data and XML schemas.

構造が多様な XML ドキュメントがある場合、またはリレーショナル構造へのマッピングが難しい複雑なスキーマや複数のスキーマに従った XML ドキュメントがある場合に、ネイティブ XML ストレージが役立ちます。Native XML storage is useful when you have XML documents that have a range of structures, or you have XML documents that conform to different or complex schemas that are too hard to map to relational structures.

例: xml データ型を使用した XML データのモデリングExample: Modeling XML Data Using the xml Data Type

トピックごとに章が設けられ、それぞれの章の中には複数の節がある構成の XML 形式の製品マニュアルを考えてみます。Consider a product manual in XML format that is made up of a separate chapter for each topic and that has multiple sections within each chapter. 節には項が含まれる場合があります。A section can contain subsections. したがって、<section> は再帰要素になります。As a result, <section> is a recursive element. 製品マニュアルには、混合コンテンツ、図表、および技術データが大量に含まれているので、データは部分的に構造化された状態です。Product manuals contain a large amount of mixed content, diagrams, and technical material; the data is semi-structured. ユーザーは、「インデックス設定」に関する章の「クラスター化インデックス」に関する節を検索するなど、関心のあるトピックをコンテキストにより検索したり、技術データにクエリを実行します。Users may want to perform a contextual search for topics of interest such as searching for the section on "clustered index" within the chapter on "indexing", and query technical quantities.

この XML ドキュメントに適したストレージ モデルは xml データ型列です。An appropriate storage model for your XML documents is an xml data type column. このモデルであれば、XML データの InfoSet コンテンツが保持されます。This preserves the InfoSet content of your XML data. XML 列にインデックスを設定して、クエリ パフォーマンスを向上できる利点もあります。Indexing the XML column benefits query performance.

例: XML データの正確なコピーの保持Example: Retaining Exact Copies of XML Data

たとえば、政府の規定により、XML ドキュメントのテキストの正確なコピーを保持する必要があるとします。For illustration, assume that government regulations require you to retain exact textual copies of your XML documents. 署名済み文書、法務文書、株取引の注文書などが該当します。For example, these could include signed documents, legal documents, or stock transaction orders. このようなドキュメントは [n]varchar(max) 列に保存できます。You may want to store your documents in a [n]varchar(max) column.

クエリを行うには、実行時にデータを xml データ型に変換して XQuery を実行します。For querying, convert the data to xml data type at run time and execute Xquery on it. 実行時の変換は、ドキュメントが大きい場合は特にコストが高くなる可能性があります。The run-time conversion may be costly, especially when the document is large. 頻繁にクエリを実行する場合は、 xml データ型の列にドキュメントを冗長に保存してインデックスを設定しておき、 [n]varchar(max) 型の列からドキュメントの正確なコピーを返すことができます。If you query frequently, you can redundantly store the documents in an xml data type column and index it while you return exact document copies from the [n]varchar(max) column.

XML 列は [n]varchar(max) 型の列を基にした計算列にすることができます。The XML column may be a computed column, based on the [n]varchar(max) column. ただし、XML 計算列に XML インデックスを作成すること、および [n]varchar(max) 型または varbinary(max) 型の列に XML インデックスを作成することはできません。However, you cannot create an XML index on a computed, XML column, nor can an XML index be built on [n]varchar(max) or varbinary(max) columns.

XML ビュー テクノロジXML View Technology

XML スキーマとデータベース内のテーブルとのマッピングを定義することで、永続的なデータの "XML ビュー" を作成します。By defining a mapping between your XML schemas and the tables in a database, you create an "XML view" of your persistent data. XML ビューを使用して基になるテーブルのデータを格納する場合に、XML 一括読み込みを行うことができます。XML bulk load can be used to populate the underlying tables by using the XML view. XML ビューには XPath Version 1.0 を使用してクエリを実行できます。テーブルでクエリが実行されるときには SQL クエリに変換されます。You can query the XML view by using XPath version 1.0; the query is translated to SQL queries on the tables. これと同様に、更新もテーブルに反映されます。Similarly, updates are also propagated to those tables.

このテクノロジは、次のような場合に役立ちます。This technology is useful in the following situations:

  • 既存のリレーショナル データの XML ビューを使用した XML 中心のプログラミング モデルが必要な場合。You want to have an XML-centric programming model using XML views over your existing relational data.

  • 外部のパートナーから提供された XML データのスキーマ (XSD、XDR) がある場合。You have a schema (XSD, XDR) for your XML data that an external partner may have provided.

  • データの順序が重要ではない場合、クエリ テーブル データが再帰的でない場合、または事前に再帰の最大の深さがわかっている場合。Order is not important in your data, or your query table data is not recursive, or the maximal recursion depth is known in advance.

  • XPath Version 1.0 を使用して、XML ビューからデータに対するクエリや変更を行う場合。You want to query and modify the data through the XML view by using XPath version 1.0.

  • XML ビューを使用し、XML データの一括読み込みを行ってそれを基になるテーブルに分解する場合。You want to bulk load XML data and decompose them into the underlying tables by using the XML view.

例としては、データ交換や Web サービス向けに XML として公開されたリレーショナル データ、固定スキーマにバインドされた XML データなどがあります。Examples include relational data exposed as XML for data exchange and Web services, and XML data with fixed schema. 詳細については、 MSDN オンライン ライブラリを参照してください。For more information, see the MSDN Online Library.

例: AXSD (注釈付き XML スキーマ) を使用したデータ モデリングExample: Modeling Data Using an Annotated XML Schema (AXSD)

たとえば、顧客、注文、品目などの既存のリレーショナル データを XML として処理するとします。For illustration, assume that you have existing relational data, such as customers, orders, and line items, that you want to handle as XML. リレーショナル データに AXSD を使用して、XML ビューを定義します。Define an XML view by using AXSD over the relational data. XML ビューを使用すると、テーブルに XML データを一括で読み込み、XML ビューでリレーショナル データに対するクエリや更新を行うことができます。The XML view allows you to bulk load XML data into your tables and query and update the relational data by using the XML view. SQL アプリケーションの実行を中断することなく、XML でマークアップされたデータを他のアプリケーションと交換する必要がある場合に、このモデルが役立ちます。This model is useful if you have to exchange data that contains XML markup with other applications while your SQL applications work uninterrupted.

ハイブリッド モデルHybrid Model

リレーショナル列と xml データ型の列を組み合わせることがデータ モデリングとして適している場合も多くあります。Frequently, a combination of relational and xml data type columns is appropriate for data modeling. XML データの値の一部をリレーショナル列に保存し、残り (または XML 値全体) を XML 列に保存することができます。Some of the values from your XML data can be stored in relational columns, and the rest, or the whole XML value stored in an XML column. そうすることで、リレーショナル列に作成したインデックスやロック特性を制御しやすくなり、パフォーマンスが向上する場合があります。This may yield better performance in that you have more control over the indexes created on the relational columns and locking characteristics.

リレーショナル列に保存する方が適切な値はワークロードによって異なります。The values to store in relational columns depend on your workload. たとえば、パス式 /Customer/@CustId を基にすべての XML 値を取得する場合、CustId 属性の値をリレーショナル列に昇格してインデックスを設定することにより、クエリ パフォーマンスが向上する可能性があります。For example, if you retrieve all the XML values based on the path expression, /Customer/@CustId, promoting the value of the CustId attribute into a relational column and indexing it may yield faster query performance. 一方で、XML データが冗長性なしで多数のリレーショナル列に分解されている場合、再構成のコストが甚大になる可能性があります。On the other hand, if your XML data is extensively and nonredundantly decomposed into relational columns, the re-assembly cost may be significant.

テーブルのコンテンツを XML に変換した場合など、十分に構造化された XML データでは、すべての値をリレーショナル列にマップすることができ、XML ビュー テクノロジを使用できる場合もあります。For highly structured XML data, for example, the content of a table has been converted into XML; you can map all values to relational columns, and possibly use XML view technology.

XML データの粒度Granularity of XML Data

XML 列に保存される XML データの粒度は、ロックの際に非常に重要であるだけでなく、更新の際にも重要です。The granularity of the XML data stored in an XML column is very important for locking and, to a lesser degree, it is also important for updates. SQL ServerSQL Server では、XML データと XML 以外のデータに対して同一のロック メカニズムを使用します。uses the same locking mechanism for both XML and non-XML data. したがって行レベルのロックを設定すると、行内のすべての XML インスタンスがロックされます。Therefore, row-level locking causes all XML instances in the row to be locked. 粒度が粗い場合、マルチユーザー シナリオで更新のために大きな XML インスタンスをロックすると、スループットが低下します。When the granularity is large, locking large XML instances for updates causes throughput to decline in a multiuser scenario. 一方、分割しすぎるとオブジェクトのカプセル化状態が失われ、再構成のコストが上がります。On the other hand, severe decomposition loses object encapsulation and increases reassembly cost.

優れた設計を行うには、データ モデリングの要件とロックや更新の特性との間でバランスを取ることが重要です。A balance between data modeling requirements and locking and update characteristics is important for good design. ただし SQL ServerSQL Serverでは、実際に保存される XML インスタンスのサイズが決定的な要因になることはありません。However, in SQL ServerSQL Server, the size of actual stored XML instances is not as critical.

たとえば、新旧の XML インスタンスの比較による BLOB (バイナリ ラージ オブジェクト) やインデックスの部分更新が新しくサポートされるようになったので、それにより XML インスタンスが更新されます。For example, updates to an XML instance are performed by using new support for partial binary large object (BLOB) and partial index updates in which the existing stored XML instance is compared to its updated version. BLOB (バイナリ ラージ オブジェクト) の部分更新は、2 つの XML インスタンスの差異を比較して差分のみを更新します。Partial binary large object (BLOB) update performs a differential comparison between the two XML instances and updates only the differences. インデックスの部分更新は、XML インデックスの変更が必要な行のみを変更します。Partial index updates modify only those rows that must be changed in the XML index.

xml データ型の制限事項Limitations of the xml Data Type

xml データ型には、次の一般的な制限事項が適用されます。Note the following general limitations that apply to the xml data type:

  • 保存する xml データ型のインスタンスは 2 GB 以内である必要があります。The stored representation of xml data type instances cannot exceed 2 GB.

  • sql_variant インスタンスのサブタイプとしては使用できません。It cannot be used as a subtype of a sql_variant instance.

  • text または ntextにキャストしたり、変換することはできません。It does not support casting or converting to either text or ntext. 代わりに varchar(max) または nvarchar(max) を使用します。Use varchar(max) or nvarchar(max) instead.

  • 比較や並べ替えはできません。It cannot be compared or sorted. したがって、 xml データ型は GROUP BY ステートメント内では使用できません。This means an xml data type cannot be used in a GROUP BY statement.

  • ISNULL、COALESCE、および DATALENGTH を除く組み込みのスカラー関数のパラメーターとしては使用できません。It cannot be used as a parameter to any scalar, built-in functions other than ISNULL, COALESCE, and DATALENGTH.

  • インデックスのキー列としては使用できません。It cannot be used as a key column in an index. ただし、クラスター化インデックスのデータとして使用したり、非クラスター化インデックスの作成時に INCLUDE キーワードを使用して明示的に非クラスター化インデックスに追加することはできます。However, it can be included as data in a clustered index or explicitly added to a nonclustered index by using the INCLUDE keyword when the nonclustered index is created.

  • XML 要素は 128 レベルまで入れ子にできます。XML elements can be nested up to 128 levels.

参照See Also

XML ドキュメントの一括インポートと一括エクスポートの例 (SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)