使用 XPath 谓词优化 XQuery 查询
Posted
技术标签:
【中文标题】使用 XPath 谓词优化 XQuery 查询【英文标题】:Optimizing XQuery interogation with XPath predicate 【发布时间】:2018-08-24 18:49:40 【问题描述】:所以,我正在优化从 SQL 继承的查询,与它在 sql 中的工作方式相比,我遇到了一些性能问题。
基本上,我的 php 脚本发送 2 到 5 组两个(数字)值。
这些必须与我收藏的元素中的 id 和 doc 进行比较。当然,谓词中的元素越少,查询越快 我的 for with 谓词现在看起来像这样:
for $p in collection("/db/col1")//set1/page[(id eq val1 and doc eq altval1) or (id eq val2 and doc eq altval2) or (id eq val3 and doc eq altval3) or (id eq val4 and doc eq altval4) or (id eq val5 and doc eq altval5)]
我需要以某种方式编写一个根据值的数量而变化的谓词。我尝试编写一个函数来编写条件并在谓词中调用它,具体取决于传递了多少值,但这似乎不起作用。
如果有人知道解决方法,我将不胜感激。
编辑:删除代码中的错字。
【问题讨论】:
在路径中使用多个“//”运算符看起来可能效率低下。你真的确定你需要这样做吗? 你完全正确。那只是我的一个错字。我已经做了相应的修改。 【参考方案1】:如果$val
和$altval
是两个值序列,那么可以写泛型谓词
SOMETHING[some $i in 1 to count($val) satisfies (id=$val[$i] and doc=$altval[$i]]
但我不知道它的性能如何。
【讨论】:
【参考方案2】:如果你想在谓词中使用一个函数,那么下面的方法可能对你有用:
xquery version "3.1";
declare variable $local:criteria := array
("val1", "altval1"),
("val2", "altval2"),
("val3", "altval3"),
("val4", "altval4"),
("val5", "altval5")
;
declare function local:match($id, $doc) as xs:boolean
array:size(
array:filter($local:criteria, function($x)
$id eq $x[1] and $doc eq $x[2]
)
) eq 1
;
collection("/db/col1")//set1//page[local:match(id, doc)]
注意 - 我没有测试上述的性能。
还值得一提的是,eXist-db 中的祖先查找非常快,因为它有 DLN node numbering。因此,如果 //set1//page
比 //page[ancestor::set1]
慢,可能值得测试。
【讨论】:
【参考方案3】:我对这两个答案都投了赞成票,因为它们都完成了工作,而且我可以清楚地看到改进。我不想选择其中一个,因为我真的认为目前这更多的是品味问题。
就我而言,我发现了第三个,特别是对于这种情况,它甚至更快。不利的一面是,它非常乏味、不雅且非常具体。此外,虽然您的答案可以适用于几个类似的问题,但这仅适用于您在外部“触发”XQuery 脚本的情况。就这样吧:
我实际上制作了五个不同的 xql 脚本,一个处理一对值,一个处理前两对值,一个处理前三对值等等。
所以脚本一将包含:
for $p in collection("/db/col1")//set1/page[id eq val1 and doc1 eq altval1]
在脚本 5 中,您会发现类似于原版的内容:
for $p in collection("/db/col1")//set1/page[(id eq val1 and doc eq altval1) or (id eq val2 and doc eq altval2) or (id eq val3 and doc eq altval3) or (id eq val4 and doc eq altval4) or (id eq val5 and doc eq altval5)]
然后我从我的 PHP 脚本中调用它们,具体取决于我需要发送的参数数量。我不会尝试将其扩展到超过五对,但目前它可以完成工作。
【讨论】:
以上是关于使用 XPath 谓词优化 XQuery 查询的主要内容,如果未能解决你的问题,请参考以下文章
T-SQL XQuery (XML路径查询) (转)http://blog.csdn.net/Beirut/article/details/8150116