我应该使用value()还是exists()来过滤xml中的记录速度

问题描述:

问题#1:可以使用value()exist()方法来过滤行。我想知道哪一个更快。我应该使用value()还是exists()来过滤xml中的记录速度

问题2:在SQL中,我们使用IN运营商像以下:

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

同样可以,我们使用IN运营商使用XML处理时?

查询#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' 

此致

+0

*如果你有两匹马,并且你想知道哪两条马更快,那么**比赛你的马*** - 看看[哪个更快?](http://ericlippert.com/2012/12/17/performance-rant /)由Eric Lippert为更多背景 –

(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表达式的一边获取多个值的唯一方法是使用匹配多个节点的路径表达式。

+0

好吧,我想用节点(/ doc/value)来分解xml,这样我会得到三行,之后,我想得到2和3但不是1,我怎样才能得到它使用XML。 – user3129097