我有一个这种形式的复杂类层次结构:
- A (common ancestor)
* B
- C
* D
* E
* F
- G
* H
* I
从我的应用程序中我需要这种查询:
SELECT FROM D
WHERE ...
但最近我还想做这样的查询:
SELECT FROM A
WHERE @class IN ['D', 'I'] AND ...
我的问题是这个最后一个查询的效率是多少,哪个是优化它的最佳做法。
答案 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
使用查询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 < / p>