6

我正在使用 SQL Server 2008 的 xml 数据类型进行一些粗略的基准测试。我已经看到了许多在子句.exist中使用的地方。where不过,我最近比较了两个查询并得到了奇怪的结果。

select count(testxmlrid) from testxml
where Attributes.exist('(form/fields/field)[@id="1"]')=1

此查询大约需要 1.5 秒才能运行,除了主键(testxmlrid)之外没有任何索引

select count(testxmlrid) from testxml
where Attributes.value('(/form/fields/field/@id)[1]','integer')=1

另一方面,此查询大约需要 0.75 秒才能运行。

我正在使用非类型化 XML,并且我的基准测试是在 SQL Server 2008 Express 实例上进行的。数据集中大约有 15,000 行,每个 XML 字符串大约 25 行长。

我得到的这些结果正确吗?如果是这样,为什么每个人都使用.exist? 我做错了什么并且.exist可以更快吗?

4

2 回答 2

3

你不是在计算同样的事情。您的.exist查询(form/fields/field)[@id="1"]检查 XML 中所有出现的@id,直到找到具有该值的一个,1并且您的.value查询(/form/fields/field/@id)[1]仅获取@id.

测试这个:

declare @T table
(
  testxmlrid int identity primary key,
  Attributes xml
)

insert into @T values
('<form>
    <fields>
      <field id="2"/>
      <field id="1"/>
    </fields>
  </form>')

select count(testxmlrid) from @T
where Attributes.exist('(form/fields/field)[@id="1"]')=1

select count(testxmlrid) from @T
where Attributes.value('(/form/fields/field/@id)[1]','integer')=1

.exist查询计数为 1,因为它在第二个节点中找到,@id=1查询field计数.value为 0,因为它只检查第一次出现的 的值@id

.exist只检查第一次出现@idlike 您的查询的值的.value查询如下所示。

select count(testxmlrid) from @T
where Attributes.exist('(/form/fields/field/@id)[1][.="1"]')=1
于 2011-05-27T06:05:16.830 回答
0

差异可能来自您的索引。

索引将PATH提高子句exist()谓词的性能WHERE,而PROPERTY索引将提高value()函数的性能。

阅读:http: //msdn.microsoft.com/en-us/library/bb522562.aspx

于 2011-05-27T06:36:23.043 回答