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

Efficient OSQL union query from two classes from the same ancestor

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

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

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

SELECT FROM D
WHERE ...

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

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

我的问题是最后一个查询的效率如何,优化它的最佳做法是什么。

尝试使用我创建的示例数据集进行查询

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

希望对您有所帮助。 伊万

我声明我不知道我是否理解了你问题的意思。 我知道您想知道使用 SELECT FROM A WHERE @class IN ['D', 'I'].

查询是否更快

我已经用 class A 的 5000 条记录,class B 的 5000 条记录,class C 的 5000 条记录等进行了测试...

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

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

第二个查询应该更快,因为它没有select class A (45000) 的所有记录,然后评估子句where,但是只有 5000 条 D 类记录和 5000 条 I 类记录