2017-09-18 192 views
0

我有以下SQL查詢:甲骨文連接優化

select dres.colA, 
     dres.colP, 
     dres.ID, 
     dre.ID, 
     dre.colED, 
     dre.VID, 
     vpp.VID, 
     vpp.colDESC 
from table1 dres 
    left join table2 dre on dres.ID = dre.ID 
    left join table3 vpp on vpp.VID = dre.VID  
where dre.START_TIME >= date '2017-01-01'; 

你有任何建議,查詢如何更好地工作(或應該)? 喜歡的東西:

...where dres.ID in (select * from table2 
        where VID in (select * from table3)).... 
+0

對於連接優化,請確保您在連接涉及的列上有適當的索引。對於基於子查詢的in子句的使用應該比連接(通常) – scaisEdge

+0

的性能低,並且該索引應該幫助數百萬行?我不這麼認爲......只會導致嵌套循環 – Thomas

+0

需要行數並解釋計劃 – Thomas

回答

1

首先,你where條款的改變外連接到內部連接。因此,通過編寫查詢作爲開始:

select dres.colA, dres.colP, dres.ID, 
     dre.ID, dre.colED, dre.VID, 
     vpp.VID, vpp.colDESC 
from table1 dres join 
    table2 dre 
    on dres.ID = dre.ID join 
    table3 vpp 
    on vpp.VID = dre.VID  
where dre.START_TIME >= date '2017-01-01'; 

開始是與table2(id, vid, start_time, colED)table3(vid, colDESC)指標的地方。

可能的替代索引策略將工作:table2(start_time, id, vid, colED)。這將允許where子句使用索引。但是那個特定的where子句可能不是高度選擇性的。

+0

您剛剛從左連接更改爲連接? – 4est

+0

@ 4est。 。 。並建議特定的索引。 –

+0

index我知道....我想知道什麼會更好:請加入或內部放置選擇? – 4est