Sql server where子句中哪个更快.exist或.value?
我正在使用SQLServer2008的xml数据类型进行一些粗略的基准测试。我见过很多地方,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秒 我使用的是非类
.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