Sql-Server-2008

儲存 XML 數據的數據類型:VARCHAR(MAX) 或 XML

  • July 31, 2021

我正在使用 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)列中時,我應該考慮哪些因素

這些因素是:

  1. XML類型可通過 XQuery 表達式進行查詢/解析,包括能夠使用FLWOR 語句和迭代
  2. 變數和列中的數據XML可以通過XML DML使用 XQuery 表達式進行內聯修改。
  3. XML數據儲存為 UTF-16 LE (Little Endian),因此VARCHAR(MAX)將是一個糟糕的選擇,因為它可能導致數據失去。因此,真正的決定應該XML和之間NVARCHAR(MAX),因為NCHAR/NVARCHAR也是 UTF-16 LE。
  4. XML可以針對 XSD / 驗證數據XML SCHEMA COLLECTION。如果未指定 XML Schema Collection,則不會進行任何驗證(除了確保格式正確),但在使用NVARCHAR(MAX).
  5. 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因為XMLUTF XML-16 是

$$ mostly $$雙字節)。這種優化可以節省大量空間,並且本身就有足夠的理由使用XML數據類型。 6. XML 數據可以通過專門的XML 索引進行索引

引用自:https://dba.stackexchange.com/questions/11341