2017-09-18 252 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