如何提高sql查询的性能?

如何提高sql查询的性能?,sql,oracle,Sql,Oracle,我正在使用oracle sql。我有一个问题: 问题1 select t1.object_id object1, t2.object_id ... --etc-- from objects t1, objects t2, object_types t3 ... --etc-- where ... --many conditions-- 它确实有效。现在我必须选择t1.object1的n级父级 这是我的疑问: 问题2: select object_id from o

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

问题1

    select t1.object_id object1, t2.object_id ... --etc--
from objects t1, objects t2, object_types t3 ... --etc--
where ... --many conditions--
它确实有效。现在我必须选择t1.object1的n级父级

这是我的疑问:

问题2:

 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倍左右。在我看来,之所以会发生这种情况,是因为每次都会对每个对象执行查询

现在我需要做一个性能良好的大查询。我怎么做

首先,我需要提高query2的性能。我希望query3不要执行很多次。我可以
bulk将它收集到某个变量中,但我希望使用尽可能多的pl/sql。所以我考虑使用-as语法

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子句中编写分层查询吗?

如果您想提高速度,就不想执行嵌套查询。尝试将嵌套查询中存在的每个数据集放入临时表中,并将它们连接起来。然后,只需拉取所需的列和较小的数据集,并运行一次。您是对的,嵌套查询将反复运行,因此如果您有大量数据,则效率低下

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

我决定在我的函数中进行两次查询。首先是问题1,我没有改变它。然后我意识到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;

我想,我的提问有问题。我写了一个新的查询,效果很好。现在我有相当好的表现。谢谢大家!

运行查询时出现异常?谢谢。我明天试试。