2017-02-24 41 views
2

请问如何让这个查询的执行速度比目前更快?如何使这个Oracle select语句执行得更快?

T2.ADI is indexed on TABLE2 
T1.ADI is indexed on TABLE1 
T1.RC AND T1.BEG_DT_TM is composite indexed on TABLE1 

我还能做些什么来使其更快吗?

SELECT T1.ASI, T1.RC, T1.BEG_DT_TM 
FROM TABLE1 T1 
INNER JOIN TABLE2 T2 
    ON T2.ADI = T1.ADI 
    AND T2.END_DT_TM > T1.BEG_DT_TM 
    AND T2.BEG_DT_TM <= T1.END_DT_TM 
WHERE T1.RC IN (12345, 56764460, 49862, 375723) 
    AND T1.BEG_DT_TM >= 
    AND T1.BEG_DT_TM <= 
    AND T1.END_DT_TM >= 
    AND T1.END_DT_TM <= 

这里是解释计划: enter image description here

+0

我假设你运行了一个解释计划来查看大部分时间都花在哪里。你能告诉我们吗?那么 - 统计数据是否是最新的?在任何情况下,连接条件都会使查询变慢,而不管其他任何事情。 – mathguy

+0

谢谢@mathguy我在 –

+0

以上附加了解释计划,这是什么“AND T1.BEG_DT_TM> =”?缺少条件的右侧。 “更快”是什么意思?多久时间?表和结果集中有多少行? – OldProgrammer

回答

0

covering索引两个表:

create index t1_c_1 on TABLE1(RC, BEG_DT_TM, END_DT_TM, ADI, ASI); 
create index t2_c_1 on TABLE2(ADI, BEG_DT_TM, END_DT_TM); 

这些索引在查询中的最优顺序与列上创建,加它们包括在选择列表中找到的其他非连接列,因此可以使用仅索引访问(避免任何需要访问实际表)。