【问题标题】:Which is faster .exist or .value in a where clause?where 子句中的 .exist 或 .value 哪个更快?
【发布时间】:2011-05-26 22:58:57
【问题描述】:

我正在使用 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 可能会更快?

【问题讨论】:

    标签: sql-server performance xpath xquery-sql


    【解决方案1】:

    你不是在计算同样的东西。您的 .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 的值。

    一个.exist 查询只检查@id 第一次出现的值,就像您的.value 查询一样。

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

    【讨论】:

    • exist() 在找到第一个匹配项后是否不会短路?
    • @Yuck - 是的,但在这种情况下,.exist 查询正在搜索 @id=1 的存在。如果第一次出现 if @id 不是 1,它会继续搜索。 .value 查询会查看第一次出现 @id 的值,如果该值不是 1,则不会继续搜索。
    【解决方案2】:

    差异可能来自您的索引。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-03
      • 2021-04-06
      • 2011-01-31
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多