Oracle分层查询性能

时间:2008-10-28 14:26:18

标签: performance oracle hierarchy

我们正在考虑使用Oracle Hierarchical查询来建模可能非常大的树结构(可能无限宽,深度为30+)。我的理解是,分层查询提供了一种递归加入SQL的方法,但是如果你手动编写一个等价的查询,它就没有提供任何真正的性能增强......这种情况是这样的吗?使用oracle层次查询,人们在性能方面有什么样的体验?

4 个答案:

答案 0 :(得分:4)

简而言之,没有分层扩展(connect by),你就无法编写递归查询。您可以以编程方式发出许多不连贯的查询。

对于所有数据库的经验法则,尤其是oracle,如果你可以在单个查询中发出结果,那么它几乎总是比以编程方式执行它更快。

答案 1 :(得分:3)

我的经历是使用更小的集合,所以我无法说明层次化查询对大集合的执行情况。

执行这些树检索时,通常会有这些选项

  • 查询所有内容并在客户端组装树。
  • 根据您之前查询结果中所需的内容,对树的每个级别执行一次查询
  • 使用Oracle提供的内置功能(START WITH,CONNECT BY PRIOR)。

在数据库中完成所有操作可以减少不必要的往返行程或浪费太多数据的浪费查询。

答案 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调用(更慢)构建结果集或在客户端执行此操作外,没有其他选择。

您可以尝试将数据分成映射(层次结构定义)和查找表(显示数据),然后将它们连接在一起。我想如果你从索引字段中获取层次结构数据,我不会期望得到很多好处,但值得一试。

您是否使用过连接尝试过?我是尝试不同变化的忠实粉丝。