我们正在考虑使用Oracle Hierarchical查询来建模可能非常大的树结构(可能无限宽,深度为30+)。我的理解是,分层查询提供了一种递归加入SQL的方法,但是如果你手动编写一个等价的查询,它就没有提供任何真正的性能增强......这种情况是这样的吗?使用oracle层次查询,人们在性能方面有什么样的体验?
答案 0 :(得分:4)
简而言之,没有分层扩展(connect by),你就无法编写递归查询。您可以以编程方式发出许多不连贯的查询。
对于所有数据库的经验法则,尤其是oracle,如果你可以在单个查询中发出结果,那么它几乎总是比以编程方式执行它更快。
答案 1 :(得分:3)
我的经历是使用更小的集合,所以我无法说明层次化查询对大集合的执行情况。
执行这些树检索时,通常会有这些选项
在数据库中完成所有操作可以减少不必要的往返行程或浪费太多数据的浪费查询。
答案 2 :(得分:1)
尝试对分层表中的数据进行分区,然后限制查询中包含的分区。
CREATE TABLE
loopy
(key NUMBER, key_hier number, info VARCHAR2, part NUMBER)
PARTITION BY
RANGE (part)
(
PARTITION low VALUES LESS THAN (1000),
PARTITION mid VALUES LESS THAN (10000),
PARTITION high VALUES LESS THAN (MAXVALUE)
);
SELECT
info
FROM
loopy PARTITION(mid)
CONNECT BY
key = key_hier
START WITH
key = <some value>;
现在有趣的问题就变成了你的分区策略。 Oracle提供了几种选择。
答案 3 :(得分:0)
我已经看到使用connect by可能比较慢但是与什么相比?除了使用递归PL / SQL调用(更慢)构建结果集或在客户端执行此操作外,没有其他选择。
您可以尝试将数据分成映射(层次结构定义)和查找表(显示数据),然后将它们连接在一起。我想如果你从索引字段中获取层次结构数据,我不会期望得到很多好处,但值得一试。
您是否使用过连接尝试过?我是尝试不同变化的忠实粉丝。