我应该使用value()或exists()来过滤xml中的记录以获得速度

时间:2017-04-02 08:09:43

标签: sql-server

问题#1:可以使用value()exist()方法过滤行。我想知道哪一个更快。

问题2:在SQL中,我们使用IN运算符,如下所示:

select * 
from abc 
where abcid in (1,2)

类似地,我们在处理XML时可以使用IN运算符吗?

查询#1:

WITH XMLNAMESPACES (  
     'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,  
     'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)  
SELECT  
    CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'nvarchar(100)')
FROM  
    Production.ProductModel  
WHERE
    CatalogDescription.exist('/PD:ProductDescription[@ProductModelName=''Mountain 100''][1]') = 1

查询#2:

WITH XMLNAMESPACES (  
     'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,  
     'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)  
SELECT  
    CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'nvarchar(100)')
FROM  
    Production.ProductModel  
WHERE
    CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'nvarchar(100)') = 'Mountain 100'

您诚挚的

1 个答案:

答案 0 :(得分:0)

(1)差异可能来自你的指数。

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

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

(2)XPath 1.0的=运算符以这种方式工作,尽管XPath 1.0不提供编写序列的语法。因此,如果您有一个格式为

的XML文档
<doc>
  <value>1</value>
  <value>2</value>
  <value>3</value>
</doc>

然后像//doc[value = 2]这样的表达式将返回该doc元素。

在XPath 2.0中,语法(1,2,3)将创建一个包含三个整数的序列,您可以编写类似$i = (1, 2, 3)的条件。但是文字序列不是XPath 1.0的一个特性 - 在XPath表达式的一侧获取多个值的唯一方法是使用匹配多个节点的路径表达式。