我正在使用 SQL Server 2008 的 xml 数据类型进行一些粗略的基准测试。我见过很多地方在 where
子句中使用 .exist
。我最近比较了两个查询并得到了奇怪的结果。
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
可能会更快?
最佳答案
你们计算的不是同一件事。您的 .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,因为它在第二个 field
节点和 中找到了
查询计数为 0,因为它只检查第一次出现 @id=1
。 value@id
的值。
仅检查 @id
第一次出现的值的 .exist
查询,就像您的 .value
查询一样。
select count(testxmlrid) from @T
where Attributes.exist('(/form/fields/field/@id)[1][.="1"]')=1
关于sql-server - where 子句中的 .exist 和 .value 哪个更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146061/