【问题标题】:Is XML data type proper for large tables?XML 数据类型是否适合大型表?
【发布时间】:2012-02-29 05:25:33
【问题描述】:

我想查询 SQL Server 中存储为 XML 字段的超过 14,000,000 个文档。

我现在已经在数据库中生成了 1,000,000 行来测试,但是没有 where 条件的简单选择大约需要 3 分钟。我还应用了 XML 索引,但它的性能仍然不可接受。类似的场景需要 19 秒来处理所有字段都已键入的类似表。

这是我输入的表格:

CREATE TABLE [dbo].[Fields] (
[Id]          BIGINT     IDENTITY (1, 1) NOT NULL,
[Title]       NCHAR (10) NOT NULL,
[Duration]    INT        NOT NULL,
[Cost]        MONEY      NOT NULL,
[Consignee]   BIGINT     NOT NULL,
[Date]        DATETIME   NOT NULL,
[TariffId]    BIGINT     NOT NULL,
[InvoiceType] NCHAR (10) NOT NULL,
[IsPayed]     BIT        NOT NULL
);

这是一个 XML 示例:

<Invoice>
  <Id>1</Id>
  <Title>title</Title>
  <Duration>726643700</Duration>
  <Cost>312118909727165.6133</Cost>
  <Consignee>3120910928797722624</Consignee>
  <Date>4543-07-16T01:40:29.623</Date>
  <TariffId>3120910928797722624</TariffId>
  <InvoiceType>InvoiceType</InvoiceType>
  <IsPayed>1</IsPayed>
</Invoice>

这些是我应用的索引:

CREATE XML INDEX idx_xCol_Path on [dbo].[XML] (InvoiceItem)
   USING XML INDEX idx_xCol FOR PATH

CREATE XML INDEX idx_xCol_Value on [dbo].[XML] (InvoiceItem)
   USING XML INDEX idx_xCol FOR VALUE

【问题讨论】:

  • SELECT * 需要 3 分钟?这对我来说似乎并没有那么糟糕。我无法想象您的典型运行时查询将是 SELECT * 没有 WHERE 子句。 XML 索引也无助于这样的查询 - 只有当您正在寻找包含某些属性/值的 XML 文档时才会有帮助。您能否显示您正在比较的表结构(带有 XML 列的表,以及“所有字段都已键入的类似表”)?
  • 能否请您发布您的架构、表和索引的 DDL 以及您正在运行的查询?
  • @Quassnoi 和 AaronBertrand:抱歉耽搁了。
  • 好的,我以为您正在存储 XML 文档其他数据。您只是将数据存储为 XML。为什么?这并不是 XML 类型的真正用途。当然,它使原本需要序列化-反序列化等的应用程序变得容易,但这不是构建性能良好的数据库应用程序的方法。对我来说,您的第一个表似乎比一体式的单 XML 列表更优化。
  • @Aaron Bertrand:等一下!请先阅读我的问题的根源:stackoverflow.com/questions/9148000/…

标签: sql-server-2008 database-performance


【解决方案1】:

我的各种测试改变了我的决定。 Xml 适用于大约 1-2 百万条记录。在我的情况下,应用程序生命周期应该超过 3 年,文档生成速度。 所以我尝试使用表格而不是 xml 字段。其他可能的解决方案可能是单个记录,但存在 xml 文档大小限制。当我监控性能与记录数量时,我发现它在一百万条记录后下降。此外,在这种规模下,SQL 上的索引文件增长是不可接受的。

【讨论】:

    【解决方案2】:

    大号。避免对具有许多记录的表使用 XML,因为记录定义往往会一遍又一遍地重复。 XML 适用于标记量相对于数据较小的文档。如果您想要人类可读的表格,请使用 csv 或类似格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2011-07-21
      • 2017-03-11
      • 2014-07-16
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      相关资源
      最近更新 更多