来自同一祖先的两个类的高效OSQL联合查询

时间:2016-03-09 09:10:36

标签: query-optimization orientdb orientdb-2.1

我有一个这种形式的复杂类层次结构:

- A (common ancestor)
    * B
    - C
        * D
        * E
    * F
    - G
        * H
        * I

从我的应用程序中我需要这种查询:

SELECT FROM D
WHERE ...

但最近我还想做这样的查询:

SELECT FROM A
WHERE @class IN ['D', 'I'] AND ...

我的问题是这个最后一个查询的效率是多少,哪个是优化它的最佳做法。

2 个答案:

答案 0 :(得分:2)

使用我已创建的示例数据集尝试您的查询

SELECT FROM A
WHERE @class IN ['D', 'I']

我看到执行时间从40毫秒(冷缓存)到15毫秒(热缓存)。

使用这个,相反,我看到一个改进(热缓存3毫秒):

select expand($c)

let $a=(SELECT FROM D),
$b=(SELECT FROM I),
$c=unionAll($a,$b)

修改

这是使用WHERE和LIMIT条件的查询:

select from (
  select expand($c)

  let $a=(SELECT FROM D),
  $b=(SELECT FROM I),
  $c=unionAll($a,$b)
  )
where value = 5 LIMIT 10

希望它有所帮助。 伊万

答案 1 :(得分:2)

我声明我不知道自己是否理解了问题的含义。 我知道你想通过SELECT FROM A WHERE @class IN [' D',' I']来了解查询是否更快。

我做了一个测试,A级5000记录,B级5000,C级5000等......

使用查询SELECT FROM A WHERE @class IN ['D', 'I'] limit -1

enter image description here

使用查询SELECT EXPAND( $c ) LET $a = ( SELECT FROM D ), $b = ( SELECT FROM I ), $c = UNIONALL( $a, $b ) limit -1

enter image description here

第二个查询应该更快,因为它不会选择A类(45000)的所有记录,然后评估子句 where ,但只有类型D的5000记录和I类型的5000 < / p>