2012-03-06 41 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