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 ...

我的问题是最后一个查询的效率是多少,以及优化它的最佳实践是什么。

4

2 回答 2

2

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

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

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

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

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

希望能帮助到你。伊万

于 2016-03-09T16:56:52.547 回答
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

在此处输入图像描述

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

在此处输入图像描述

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

于 2016-03-09T16:58:34.200 回答