sql-server - where 子句中的 .exist 和 .value 哪个更快?

标签 sql-server performance xpath xquery-sql

我正在使用 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 节点和 中找到了 @id=1。 value 查询计数为 0,因为它只检查第一次出现 @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/

相关文章:

xml - Concat 函数与 XPath 中的字符串

java - 我如何使用 Xpath

java - 由于基于登录的服务器访问验证因基础结构错误而失败,因此无法连接到 MSSQL

sql-server - 在主表中添加客户特定记录

performance - Lucene.Net 搜索性能缓慢

sql - 修改 SQL 触发器,使其在插入的表包含多行时起作用

xml - Xpath 查询以匹配序列中的直接兄弟节点

sql-server - sql hub函数是否不允许整数作为列名?

SQL Server : Do I need to use GO statements between batches?

Java:超越 HashSet.contains() 的性能优化?