2008-10-28 210 views
1

我们正在研究使用Oracle Hierarchical查询来模拟可能非常大的树结构(可能无限宽,深度为30+)。我的理解是分层查询提供了一种递归加入SQL的方法,但是如果您要手动编写等效查询,它不会提供任何实际的性能增强......是这种情况吗?使用oracle分层查询,人们有哪些体验,性能明智?Oracle分层查询性能

+0

得出任何结论? – ScottCher 2008-11-03 14:36:57

回答

4

那么简短的答案是,没有分层扩展(通过连接)你不能写递归查询。你可以编程地发出许多与recurisively相关的查询。

所有数据库的经验法则,特别是oracle,是如果你可以在单个查询中发布你的结果,它几乎总是比编程更快。

+2

另一个规则是不要选择比你需要更多的数据。这可能是一种折衷。 Ben实际上是否需要展示30个深度和无限宽的层次? – 2008-10-29 06:55:27

3

我的经验一直在小得多的集合,所以我不能说大多数集合中的heirarchical查询的性能如何。

在做这些树检索,你通常有以下选择

  • 查询一切,组装在客户端树。
  • 使用Oracle提供的内置东西(START WITH,CONNECT BY PRIOR),为树的每个级别执行一次查询,建立在您知道需要从以前的查询结果中获得的东西上

在数据库中这样做会减少不必要的往返或浪费太多的数据查询。

0

我见过使用连接可以很慢,但比较什么?除了使用递归PL/SQL调用(更慢)构建结果集或在客户端执行结果集外,没有其他选择。

您可以尝试将数据分离为映射(层次结构定义)和查找表(显示数据),然后将它们连接在一起。我想我不会期望获得很大的收益,假设你从索引字段获得层次结构数据,但值得一试。

你有没有尝试过使用连接?我非常喜欢尝试不同的变化。

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提供了几个选项。