web-dev-qa-db-ja.com

XMLデータを格納するデータ型:VARCHAR(MAX)またはXML

SQL Server 2008を使用してリソースの新しいセットのスキーマを定義しています...この場合、各レコード(eg row)に格納する必要がありますXMLフラグメント。時々;頻繁ではありませんが;要素と属性の値を見つけるには、XMLをクエリする必要があります。自分の考案に任せると、xmlデータ型を使用する傾向がありますが、これは問題があると考えられています。それが私の質問につながります。

このシナリオを前提として、XMLをxml列に格納するか、それともvarchar(MAX)列に格納するかを決定する際に考慮すべき要素は何ですか。

それが役立つ場合...ここにいくつかの追加の詳細があります:

  • これらのフラグメントのスキーマの使用に関して決定は行われていません(例:XSDの
  • フラグメントのサイズは、小さいものから非常に大きいものまでさまざまです。
  • すべてのXMLは整形式です
  • 1日の間に、最大3か月間必要なオンラインクエリサポートで最大10,000個のフラグメントが収集されます
  • XMLに対するクエリは1日を通して発生しますが、このタイプの同時クエリがほとんどないため、軽いままです。
9
JoeGeeky

XMLに対するクエリが発生します SQLサーバーのxml機能による場合、XMLタイプを使用してXMLを格納し、キャストを回避します

および

xMLタイプはXML検証のために少し遅く格納される可能性があるが、基になるXMLタイプは通常のvarbinary(max)であることに注意してください

5
Oleg Dok

xMLをxml列に格納するか、varchar(MAX)列に格納するかを決定する際に考慮すべき要素は何ですか

要因は次のとおりです。

  1. XMLタイプは、 FLWORステートメントと反復 を使用できることを含め、XQuery式を介してクエリ可能/解析可能です
  2. XML変数と列のデータは、 XML DML を介してXQuery式を使用してインラインで変更できます。
  3. XMLデータはUTF-16 LE(リトルエンディアン)として格納されるため、VARCHAR(MAX)はデータの損失につながる可能性があるため、適切な選択肢ではありません。したがって、XML/NCHARもUTF-16 LEであることを考えると、本当の決定すべきNVARCHARNVARCHAR(MAX)の間になります。
  4. XML data can XSD/_XML SCHEMA COLLECTION_に対して検証されます。 XMLスキーマコレクションが指定されていない場合、検証(整形式であることの確認以外)は行われませんが、NVARCHAR(MAX)を使用する場合、このオプションは使用できません。
  5. XMLタイプの主な利点の1つは、表示される正確な文字列表現を格納せず、代わりにディクショナリを持つ高度に最適化された形式(@Olegの回答で述べられているVARBINARY(MAX)ではない)で格納されることです。要素名と属性名のリストで、IDで参照します。また、空白を削除します。以下を試してください:

    _DECLARE @Test1 XML = N'<Test><TagName>1</TagName><TagName>2</TagName></Test>';
    
    DECLARE @String1 NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    
    SET @Test1 = N'<Test><TagName>1</TagName><TagName>2</TagName><TagName>3</TagName>
    <TagName>4</TagName><TagName>5</TagName><TagName>6</TagName></Test>';
    
    SET @String1 = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    _

    戻り値:

    _XmlBytes   StringCharacters   StringBytes
    56         53                 106
    
    XmlBytes   StringCharacters   StringBytes
    84         133                266
    _

    上記の出力例からわかるように、4つの要素(3、4、5、6)を追加すると、80文字(VARCHARを使用する場合は80バイト)とNVARCHARに160バイトが追加されます。変数。それでも、XML変数に追加されたのは28バイトだけで、これはVARCHARに対して追加された値よりlessです(誰かがVARCHARを支持して主張する場合のためにXMLは、XMLがUTF-16(ほとんどが2バイト)であるためです。この最適化は、大量のスペースを節約することができ、XMLデータ型を使用するのに十分な理由です。

6
Solomon Rutzky