XML索引减慢了查询速度

时间:2016-05-03 18:38:21

标签: sql-server xml indexing sql-server-2014

我有一个具有以下结构的简单表,大约有1000万行:

CREATE TABLE [dbo].[DataPoints](
    [ID] [bigint] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [ModuleID] [uniqueidentifier] NOT NULL,
    [DateAndTime] [datetime] NOT NULL,
    [Username] [nvarchar](100) NULL,
    [Payload] [xml] NULL
)

Payload与所有行类似:

<payload>
  <total>1000000</total>
  <free>300000</free>
</payload>

Payload列上创建索引之前,以下两个查询大约需要11秒才能在我的开发计算机上执行:

SELECT AVG(Payload.value('(/payload/total)[1]','bigint')) FROM DataPoints

SELECT COUNT(*) FROM DataPoints
WHERE Payload.value('(/payload/total)[1]','bigint') = 1000000

问题是当我在Payload列上创建XML索引时,两个查询都需要更长的时间才能完成!我想知道:

1)为什么会这样?是不是应该加速查询的XML索引,或者至少是在WHERE子句中使用XML列的值的查询?

2)如果它们不适合我的情况,使用XML索引的正确方法是什么?

这是在SQL Server 2014上。

1 个答案:

答案 0 :(得分:0)

普通XML索引索引XML Payload中的所有内容

  

<强> Selective XML Indexes (SXI)

     

普通XML索引的主要限制是它们索引整个XML文档。这导致了一些显着的缺点,例如查询性能下降和索引维护成本增加,主要与索引的存储成本有关。

您需要创建一个选择性XML索引以获得更好的性能。

另一种选择是创建二级索引

XML Indexes (SQL Server)

  

要提高搜索性能,您可以创建辅助XML索引。在创建二级索引之前,必须首先存在主XML索引。

因此,主索引的目的是为了创建二级索引