我有一个具有以下结构的简单表,大约有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上。
答案 0 :(得分:0)
普通XML索引索引XML Payload中的所有内容
<强> Selective XML Indexes (SXI) 强>
普通XML索引的主要限制是它们索引整个XML文档。这导致了一些显着的缺点,例如查询性能下降和索引维护成本增加,主要与索引的存储成本有关。
您需要创建一个选择性XML索引以获得更好的性能。
另一种选择是创建二级索引
要提高搜索性能,您可以创建辅助XML索引。在创建二级索引之前,必须首先存在主XML索引。
因此,主索引的目的是为了创建二级索引