我正在使用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子句中编写分层查询?
答案 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 --;