2015-09-09 26 views
0

我正在使用oracle sql。我有一个查询:如何提高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。 我该如何尽可能快地做到这一点?

如何选择查询1中的父类型?我必须在where子句中编写分层查询吗?

+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 --; 
+0

谢谢。我明天会尝试。 –

0

我决定做2个查询我的功能。首先是query1,我没有改变它。然后我意识到我已经从我的QUERY1输出数组一个循环,所以我写了

select object_id bulk collect into some variable 
      from objects 
       where object_type_id in 
      (--new query3--) 
and rownum = 1 
      connect by prior parent_id = object_id 
      start with object_id= variable; 

我想,我在我的QUERY3问题。我写了新的查询,它运作良好。现在我有很好的表现。谢谢!