【发布时间】:2015-01-21 19:46:39
【问题描述】:
我有一个 JCR 查询,例如:
SELECT * FROM [my:nodetype] WHERE ISDESCENDANTNODE([/somepath]) OR (otherPath LIKE '/someotherpath')
它在 6 秒内执行。
otherPath 属性是一个多值字符串属性(只有两个对象设置了它)。
整个数据库中只有 7 个 my:nodetype 类型的节点
虽然两个单独的查询:
SELECT * FROM [my:nodetype] WHERE ISDESCENDANTNODE([/somepath])
还有
SELECT * FROM [my:nodetype] WHERE otherPath LIKE '/someotherpath'
在不到 1 毫秒的时间内执行。第一个查询运行这么慢有什么原因吗?也许有可能像 SQL 数据库一样在 Jackrabbit 中看到查询计划?如何调试问题?
我无法想象为什么总共搜索 7 个节点,无论搜索条件如何都会产生 7 秒的查询运行时间...
【问题讨论】:
-
我猜你用的是 Jackrabbit Oak,对吧?这是 SQL-2 优化器的限制。如果您使用 XPath,它应该可以正常工作。啊,抱歉,您不能在 XPath 中编写该查询......所以我没有选择,抱歉。您可以使用“联合”(它不是 JCR 规范的一部分,但适用于 Oak)。
-
实际上我使用的是包含在 magnolia cms 中的普通 jackrabbit,我认为那里不支持“union”。
-
好的,那么它可能是 Jackrabbit 2.x。那么我想运行两个查询是你唯一的解决方案。
-
它的 IDESCENDANTNODE 会减慢速度。就像其他人所说的那样,避免它或通过在查询之外使用多个查询/xpath/检查路径来解决它。
标签: jackrabbit jcr