如何提高sql查询的性能?

时间:2015-09-09 18:38:00

标签: sql oracle

我正在使用oracle sql。我有一个问题:

QUERY1

    select t1.object_id object1, t2.object_id ... --etc--
from objects t1, objects t2, object_types t3 ... --etc--
where ... --many conditions--

它确实有效。现在我必须选择t1.object1的n级父级。

我的查询:

QUERY2:

 select object_id
          from objects 
              where object_type_id in
            ( --query3-- ) 
and rownum = 1
            connect by prior parent_id = object_id
          start with object_id= -- t1.object_id value --;

如果我手动编写t1.object_id值,它也可以。问题是,如果我写一些数字而不是query3,它的工作速度会快100倍。发生IMO是因为查询每次都为每个对象执行。

现在我需要制作一个性能良好的大型查询。我该怎么办?

首先,我需要提高query2的性能。我希望query3不要多次执行。我可以bulk collect将它变成一些变量,但我希望尽可能多地使用pl / sql。所以我考虑使用 - 作为语法。

with types as (--query3--)
select object_id
              from objects 
                  where object_type_id in
                (types) 
    and rownum = 1
                connect by prior parent_id = object_id
              start with object_id= -- t1.object_id value --; 

此查询的输出是exeption。 我怎么能毫无例外地尽快做到这一点?

如何在query1中选择父类型?我是否必须在where子句中编写分层查询?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找速度,则不希望执行嵌套查询。尝试将嵌套查询中存在的每个数据集放入临时表并加入它们。然后,您只需提取所需的列和较小的数据集,并运行一次。你是对的,嵌套查询会一遍又一遍地运行,所以如果你有很多数据就会效率低下。

select col1, col2 into #query3
from table1

然后,

select object_id
          from objects o 
          join #query3 q on o.field=q.field
              where object_type_id = valuefromquery3
and rownum = 1
            connect by prior parent_id = object_id
          start with object_id= -- t1.object_id value --;