如何优化此查询以缩短执行时间

时间:2016-10-31 09:06:00

标签: sql oracle

这是我的查询

select case t.type
when 'N' then  (select count(*) from table10_other)
when 'L' then (select count(*) from table11_other)
when 'P' then (select count(*) from table12_other)
end as nlp, t.* 
from table t  
left outer join employee e on e.emp_id = t.emp_id
left outer join table2 t2 on t2.code= t.code and d.year = t.year 
order by e.name

包括ORDER BY部分会大大减慢我的查询速度。

2 个答案:

答案 0 :(得分:0)

如果没有order_by_clause,则不保证多次执行的同一查询将以相同的顺序检索行。 当与子查询或聚合查询一起使用时,orderby也可能具有性能。以某种排序顺序从数据库中检索数据的唯一方法是在查询中包含ORDER BY。 ORDER BY没有替代品。但是你可以通过使用连接来避免子查询,它们会给你一些性能提升和期望。

此外,如果不需要排序顺序,您最终可以使用group by。它还可以提高性能,但每次都可以获得不同的名称顺序。

答案 1 :(得分:0)

我认为你犯了一个错误,因为select count(*) from table总会给你相同的答案。我的建议是你需要像

这样的东西
select count(*) over (partition by t.type) as nlp
     , t.* 
from table t  
left outer join employee e on e.emp_id = t.emp_id
left outer join table2 t2 on t2.code= t.code and d.year = t.year 
order by e.name

或者如果你想只计算N L P

select case when t.type IN ('N','L','P') THEN 
        count(*) over (partition by t.type)  
       END as nlp
     , t.* 
from table t  
left outer join employee e on e.emp_id = t.emp_id
left outer join table2 t2 on t2.code= t.code and d.year = t.year 
order by e.name