1. 程式人生 > >標量子查詢優化外連線

標量子查詢優化外連線

同事發來2個語句,說語句1跑得慢,語句2很快就出結果。一執行,果然很慢。仔細發現,2個語句不等價。

語句1:
select l.*,o.object_name 
from v$locked_object l left join all_objects o on l.object_id=o.object_id;


語句2:
select l.*,o.object_name 
from v$locked_object l,all_objects o where l.object_id=o.object_id;

左外連線,少了一個加號,改一改語句2,使它等價為語句1.
語句3:
select l.*,o.object_name 
from v$locked_object l,all_objects o where l.object_id=o.object_id(+);


改成等價後也非常慢。


雖然語句2不等價,為什麼語句2要比1和3快?看了一會執行計劃,明白了。語句1中OBJ$走的是全表,語句2中OBJ$走的是索引。
效能瓶頸主要是all_objects非常慢,count一下花了超過15分鐘,有100w以上的資料。
最終返回資料量才80條。

標量子查詢的優化方法有哪些?
一種是建立索引優化,一種是外連線。
那麼是不是標量子查詢任何時候效能都要比外連線差呢,不一定。

下面改成標量子查詢的語句
語句4:
select l.*,(select o.object_name from all_objects o where l.object_id=o.object_id) from v$locked_object l;

現在這種情況本身有索引了,可以改寫成標量子查詢,也是非常快。
避免了OBJ$的全表,all_objects有100w多記錄
改寫後等價於原來左外連線的意思,速度槓槓的,2s內出結果。