2012-03-06 59 views
0

使用SQL Server 2008 R2在SQL Server中的XML數據列

我想創建一個表具有以下的列

[id] INT IDENTITY(1,1) NOT NULL, 
[user_id] INT NOT NULL, 
[date] DATE NOT NULL, 
[timestamp] DATETIME NOT NULL, 
[xml_data] XML NOT NULL 

與標識列主鍵和一個非聚集user_id上的索引和覆蓋xml_data和timestamp的日期。

但是,我注意到我不能將xml_data添加到索引中的INCLUDE語句。悲傷的臉,因爲當用戶搜索user_id和日期時,這將導致RID查找。

什麼是最好的方式來存儲將被查詢的XML數據?

我認爲我的選擇是

  1. 棒XML和已經格式良好的數據,但需要查詢命中
  2. 使用VARCHAR(MAX)與未知的優點/缺點
  3. 使用VARBINARY (MAX)與未知的優點/缺點

注:我懷疑我將能夠限制字符串的長度,甚至像8000

回答

3

如果你有XML - 它存儲爲XML,主要有兩個原因:

  • 它的XML存儲進行了優化 - 這是存儲只是簡單的文本,它實際上是符號化和存儲的效率比普通文字

  • 你其實可以查詢的XML時,它的存儲類型XML

但是:您不能只是索引一個這樣的XML列。 SQL Server中的任何索引可以是長度爲900個字節的最大 - XML列的大小可以高達2 GB。

如果您想索引您的XML列,請查看XML Indexes in SQL Server 2005 - 它是一種單獨的索引類型,用於非常有效地處理XML查詢。

加速XML查詢的另一種方法可能是通過從XML中提取該信息的存儲函數將您經常查詢到的XML中的某些部分「表面化」到父表上,以及將其存儲爲父表上的計算持續列。一旦它存儲在那裏,您可以像查詢其他列一樣查詢它,並且您也可以將其編入索引!但它只適用於單個信息片段(例如您的訂單中的OrderNumber - 您只有這些信息中的一個) - 它不能應用於數據集合。

+0

非常詳細的答案,非常感謝。所以,基本上,我必須吃SELECT的性能? – 2012-03-06 15:49:44

+0

@Norla:如果你不需要,就不要'選擇'XML列。另外:因爲它是以優化的方式存儲的 - 它實際上比**存儲爲'VARCHAR(MAX)'更快** – 2012-03-06 16:24:47

0

您可以使用XQuery來查詢xml字段。請參閱here