【发布时间】: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