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


9

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

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

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

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

1
xmlタイプは、元のxmlの正確な形式を保持することを保証しません。ドキュメントを変更しないという要件がある場合、nvarchar(max)が唯一のオプションです。
MartinC、2012年

@MartinCフラグメントがすでに整形式である場合、どのような変更が発生する可能性がありますか?私はあなたを信じています、私はこれを以前に聞いたことがありません...詳細をいくつか教えてもらえますか?
JoeGeeky

例:空のタグ<foo></foo>は次のようになります<foo />
gbn

@gdn Ahhh、ok ...これは意味を変えないので、それでいいのです。
JoeGeeky

回答:


5

場合XMLに対するクエリが発生します SQL ServerのXML機能により、その後、回避鋳造にXMLを格納するためのXML型を使用

そして

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


1
基になるデータはありませんVARBINARY(MAX)。これは最適化された形式です。つまり、クエリを実行しない場合でも、XMLデータ型を使用する必要があります。
ソロモンルツキー

6

保存するXML間で決定しようとしたとき、私は何の要素を考慮しなければならないxml対列varchar(MAX)の列

要因は次のとおりです。

  1. XMLタイプは、使用することができることを含む照会/ XQuery式を介して解析可能であり、FLWORステートメントと繰り返しを
  2. XML変数と列のデータは、XML DMLを介したXQuery式を使用してインラインで変更できます
  3. XMLデータはUTF-16 LE(リトルエンディアン)として保存されるVARCHAR(MAX)ため、データが失われる可能性があるため、あまり適切ではありません。したがって、真の決定がなければならないとの間であるXMLNVARCHAR(MAX)仮定すると、NCHAR/ NVARCHARまた、UTF-16 LEです。
  4. XMLXSD /に対してデータ検証できますXML SCHEMA COLLECTION。XMLスキーマコレクションが指定されていない場合、検証(整形式であることの確認以外)は行われませんが、このオプションはを使用している場合は使用できませんNVARCHAR(MAX)
  5. XMLタイプの主な利点の1つは、それが高度に最適化された形式(VARBINARY(MAX)@Olegの回答に記載されていない)で格納され、表示される正確な文字列表現を格納せず、代わりに要素と属性の名前と参照のディクショナリがあることです彼らの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)を追加VARCHARすると、NVARCHAR変数に80文字(つまり、を使用する場合は80バイト)と160バイトが追加されます。しかし、それだけでXML変数に28バイトを追加少なく、それがために追加よりも、VARCHAR(念の誰かがの賛成で議論するつもりだったVARCHARオーバーXMLため、XMLUTF-16 [ほとんど]ダブルバイトです)。この最適化は大量のスペースを節約でき、XMLデータ型を使用するのに十分な理由です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.