SQL最佳化案例-union代替or(九)

沃趣科技發表於2018-11-26

隨著Oracle版本的提升,最佳化器更趨向於智慧,比如,12c中的標量子查詢被transform成外連線。

select (select max(object_id) from test2 b where b.object_id =a.object_id) from test1 a;


11g中執行計劃如下:

進入正題,當SQL中同時有or和子查詢時,這種情況下查詢無法展開(unnest),遇到這種情況只能改SQL來改變執行計劃,並且在12c或18c中都沒有智慧改寫。

select * from test1 where owner = 'SCOTT' or object_id in (select object_id from test2);


在不改寫SQL的情況下我們在test2的join列上建立索引

create index idx_objid on test2(object_id);

下面用union改寫sql

select * from test1 where owner = 'SCOTT' union select * from test1 where object_id in (select object_id from test2);


案例較為簡單,希望透過此案例讓大家瞭解最佳化器的一些行為,和unnest產生filter的一些情形。


|  作者簡介

姚崇·沃趣科技高階資料庫技術專家

熟悉Oracle、MySQL資料庫內部機制,豐富的Oracle、MySQL故障診斷、效能調優、資料庫備份恢復、複製、高可用方案及遷移經驗。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2221561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章