来自同一祖先的两个 类 的高效 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 类记录
我有一个复杂的 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 类记录