SQL Server 2008を使用してリソースの新しいセットのスキーマを定義しています...この場合、各レコード(eg row)に格納する必要がありますXMLフラグメント。時々;頻繁ではありませんが;要素と属性の値を見つけるには、XMLをクエリする必要があります。自分の考案に任せると、xmlデータ型を使用する傾向がありますが、これは問題があると考えられています。それが私の質問につながります。
このシナリオを前提として、XMLをxml列に格納するか、それともvarchar(MAX)列に格納するかを決定する際に考慮すべき要素は何ですか。
それが役立つ場合...ここにいくつかの追加の詳細があります:
XMLに対するクエリが発生します SQLサーバーのxml機能による場合、XMLタイプを使用してXMLを格納し、キャストを回避します
および
xMLタイプはXML検証のために少し遅く格納される可能性があるが、基になるXMLタイプは通常のvarbinary(max)であることに注意してください
xMLを
xml
列に格納するか、varchar(MAX)
列に格納するかを決定する際に考慮すべき要素は何ですか
要因は次のとおりです。
XML
タイプは、 FLWORステートメントと反復 を使用できることを含め、XQuery式を介してクエリ可能/解析可能ですXML
変数と列のデータは、 XML DML を介してXQuery式を使用してインラインで変更できます。XML
データはUTF-16 LE(リトルエンディアン)として格納されるため、VARCHAR(MAX)
はデータの損失につながる可能性があるため、適切な選択肢ではありません。したがって、XML
/NCHAR
もUTF-16 LEであることを考えると、本当の決定すべきはNVARCHAR
とNVARCHAR(MAX)
の間になります。XML
data can XSD/_XML SCHEMA COLLECTION
_に対して検証されます。 XMLスキーマコレクションが指定されていない場合、検証(整形式であることの確認以外)は行われませんが、NVARCHAR(MAX)
を使用する場合、このオプションは使用できません。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
データ型を使用するのに十分な理由です。