Sql-Server-2008
儲存 XML 數據的數據類型:VARCHAR(MAX) 或 XML
我正在使用 SQL Server 2008 為一組新資源定義一個架構…在這種情況下,每條記錄(例如 row)都需要儲存 XML 片段。時; 雖然不經常;我需要查詢 XML 以查找元素和屬性值。如果留給我自己的設備,我會傾向於使用XML數據類型,儘管我被引導相信這是有問題的。所以這導致我的問題。
鑑於這種情況,在嘗試決定將 XML 儲存在XML列還是**varchar(MAX)**列之間時,我應該考慮哪些因素
如果有幫助……這裡有一些額外的細節:
- 尚未就這些片段(例如 XSD)使用模式做出決定
- 碎片的大小從小到大不等
- 所有 XML 都將是格式良好的
- 在一天的過程中,將收集多達約 10,000 個片段,需要約 3 個月的線上查詢支持
- 針對 XML 的查詢將全天發生,但應保持少量此類並發查詢
如果對 XML 的查詢將通過 sql server xml 功能發生,則使用 XML 類型儲存 xml 以避免強制轉換
和
請記住,由於 xml 驗證,XML 類型的儲存速度可能會慢一些,但 XML 的底層類型是普通的 varbinary(max)
xml
在嘗試決定將 XML 儲存在列中還是varchar(MAX)
列中時,我應該考慮哪些因素這些因素是:
- 該
XML
類型可通過 XQuery 表達式進行查詢/解析,包括能夠使用FLWOR 語句和迭代- 變數和列中的數據
XML
可以通過XML DML使用 XQuery 表達式進行內聯修改。XML
數據儲存為 UTF-16 LE (Little Endian),因此VARCHAR(MAX)
將是一個糟糕的選擇,因為它可能導致數據失去。因此,真正的決定應該在XML
和之間NVARCHAR(MAX)
,因為NCHAR
/NVARCHAR
也是 UTF-16 LE。XML
可以針對 XSD / 驗證數據XML SCHEMA COLLECTION
。如果未指定 XML Schema Collection,則不會進行任何驗證(除了確保格式正確),但在使用NVARCHAR(MAX)
.- XML 類型的一個主要好處是它以高度優化的格式儲存(不是
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
正如您在上面的範例輸出中所看到的,添加四個元素(#s 3、4、5 和 6)會為變數添加 80 個字元(因此如果使用 80 個字節
VARCHAR
)和 160 個字節。NVARCHAR
然而,它只向 XML 變數添加了 28 個字節,這比它添加的要少VARCHAR
(以防萬一有人反對,VARCHAR
因為XML
UTFXML
-16 是$$ mostly $$雙字節)。這種優化可以節省大量空間,並且本身就有足夠的理由使用
XML
數據類型。 6. XML 數據可以通過專門的XML 索引進行索引