Sql server where子句中哪个更快.exist或.value?

Sql server where子句中哪个更快.exist或.value?,sql-server,performance,xpath,xquery-sql,Sql Server,Performance,Xpath,Xquery Sql,我正在使用SQLServer2008的xml数据类型进行一些粗略的基准测试。我见过很多地方,.exist在where子句中使用。不过,我最近比较了两个查询,得到了奇怪的结果 select count(testxmlrid) from testxml where Attributes.exist('(form/fields/field)[@id="1"]')=1 此查询运行大约需要1.5秒,除了主键(testxmlrid)之外,没有任何索引 另一方面,此查询运行大约需要0.75秒 我使用的是非类

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

select count(testxmlrid) from testxml
where Attributes.exist('(form/fields/field)[@id="1"]')=1
此查询运行大约需要1.5秒,除了主键(testxmlrid)之外,没有任何索引

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

我使用的是非类型化XML,我的基准测试是在SQLServer2008Express实例上进行的。数据集中大约有15000行,每个XML字符串大约有25行长


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

你没有计算同样的事情。你的
.exist
查询
(表单/字段/字段)[@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
差异可能来自您的索引

路径
索引将提高
WHERE
子句上的
exist()
谓词的性能,而
属性
索引将提高
value()
函数的性能

阅读:

是否
exist()
在找到第一个匹配项时是否没有短路?@是-是,但在本例中
.exist
查询正在搜索
@id=1
的存在。如果首次出现的If
@id
不是1,它将继续搜索。
.value
查询查看第一次出现的
@id
的值,如果该值不是1,则不继续搜索。
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
select count(testxmlrid) from @T
where Attributes.exist('(/form/fields/field/@id)[1][.="1"]')=1