oracle如何提高 SQL 查询从 2 连接的速度

标签: sql Oracle
发布时间: 2017/4/15 18:57:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 3 表︰ t1、 t2、 t3。

t1-层次结构表 (有 id 和 parent_id)

t1 与 t2 相连,t2 与 t3 连接 (连接)

输入︰ 一些 id 的 t1

有必要对这些标识符 (要收集所有父母节点) 建构起来的一棵树

然后,构造一棵树,有粘在一起,t2 和 t3

它也有必要恢复 (从 t3) 子女为父母上面的 t3name 值

输出︰ 它是需要接收分层树的每个 t3name

我的 SQL 请求,但它是很慢的︰

Miniexample: http://sqlfiddle.com/# ! 4/0b607/2

SELECT id, name, t3name FROM 
(SELECT distinct t1.id as id, 
                 t1.parent as parent, 
           t1.name as name, 
           connect_by_root(t3.name) as t3name
    FROM table1 t1
    LEFT OUTER JOIN table2 t2
        ON t1.t2_id = t2.id
    LEFT OUTER JOIN table3 t3
        ON t2.t3_id = t3.id
    START WITH t1.id in (83, 98, 9, 19, 4, 101)
        CONNECT BY PRIOR t1.parent = t1.id)
WHERE t3name IS NOT NULL
START WITH parent = 0
    CONNECT BY PRIOR id = parent and PRIOR t3name = t3name

解决方法 1:

它是有点难要帮你调你的查询没有看到的执行计划,但是知道你正确那么你需要 2 联接只为的值 t3name

如果真是案例然后试着第一次得到分层数据从表 1 和表 2 和表 3 一起结果。

这样试试︰

SELECT id, name, t3name FROM 
(SELECT distinct t1.id as id, 
                 t1.parent as parent, 
           t1.name as name, 
           t3.name as t3name
    FROM (select tt1.name, tt1.id, tt1.parent, connect_by_root(tt1.t2_id) t2_id
         from table1 tt1 
         START WITH tt1.id in (83, 98, 9, 19, 4, 101)
        CONNECT BY PRIOR tt1.parent = tt1.id) t1
    JOIN table2 t2
        ON t1.t2_id = t2.id
    JOIN table3 t3
        ON t2.t3_id = t3.id
    )
WHERE t3name IS NOT NULL
START WITH parent = 0
    CONNECT BY PRIOR id = parent and PRIOR t3name = t3name; 

我添加到您的小提琴一些主键 (来看是否我可以让它使用索引),把这两个查询。看看这里

赞助商