【问题标题】:XML Data Column in SQL ServerSQL Server 中的 XML 数据列
【发布时间】:2012-03-06 15:03:21
【问题描述】:

使用 SQL Server 2008 R2

我想创建一个包含以下列的表格

[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 和时间戳。

但是,我注意到我无法将 xml_data 添加到索引中的 INCLUDE 语句中。悲伤的脸,因为当用户搜索 user_id 和 date 时,这将导致 RID 查找。

存储要查询的 xml 数据的最佳方式是什么?

我认为我的选择是

  1. 坚持使用 xml 并拥有格式良好的数据,但要接受查询
  2. 使用具有未知优缺点的 VARCHAR(MAX)
  3. 使用具有未知优缺点的 VARBINARY(MAX)

注意:我怀疑我能否将字符串的长度限制为 8000 之类的长度。

【问题讨论】:

    标签: sql sql-server xml sql-server-2008-r2


    【解决方案1】:

    如果您有 XML - 将其存储为 XML,主要有两个原因:

    • 它针对 XML 存储进行了优化 - 它仅存储为纯文本,它实际上被标记化并比纯文本更有效地存储

    • 当 XML 存储为 XML

    • 类型时,您实际上可以查询 XML

    但是:你不能只是像这样索引一个 XML 列。 SQL Server 中的任何索引的最大值都可以是 900 字节 - XML 列的大小可以达到 2 GB。

    如果您想为您的 XML 列建立索引,请查看 XML Indexes in SQL Server 2005 - 它是一种单独的索引类型,旨在非常有效地处理对 XML 的查询。

    另一种加快 XML 查询速度的方法可能是将您经常查询的某些 XML 片段“显示”到父表上,方法是使用从 XML 中提取该信息片段的存储函数,并存储它作为父表上的计算持久列。一旦它存储在那里,您就可以像查询任何其他列一样对其进行查询,也可以对其进行索引!它仅适用于单个条信息,但是(例如,您的订单中的OrderNumber - 您只有其中一个) - 它不能应用于数据集合。

    【讨论】:

    • 非常详细的回答,非常感谢。所以,基本上,我将不得不吃掉 SELECT 的性能损失?
    • @Norla:如果您不需要,请不要SELECT XML 列。另外:因为它以优化的方式存储 - 它实际上会比存储为 VARCHAR(MAX) 更快
    【解决方案2】:

    您可以使用 XQuery 来查询 xml 字段。见here

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2013-08-03
      • 2010-10-01
      相关资源
      最近更新 更多