2016-01-11 41 views
0

我有2个需要加入的表。提高连接性能

都有很多记录。

表(表a)中的一个索引如下:account_number,start_date,end_date(全部唯一)。

第二个表没有索引(表b)。

表a有大约450,000,000条记录,表b有大约20,000,000条记录。 眼下加入需要大约20分钟,我需要更快.. 这是查询:

select * 
from a, b 
where 
    a.ACCOUNT_NUMBER = b.ACCOUNT_NUMBER AND 
    TRUNC(a.CREATE_DATE) BETWEEN b.START_DATE AND b.END_DATE 

,关于如何提高它的任何想法(索引,分区,另一种加入的) 有什么想法将受到欢迎。

+2

在最合理的情况下,此查询可能会返回数千万行。结果集有多大?您的查询可能已被优化。结果集可能真的很大。 –

+1

开始时,您可以在'b.account_number'上创建索引。如果此列值分散可能足够。 – partlov

+2

你能发布dbms_xplan输出吗? – stee1rat

回答

2

这些是大型表格。首先,使用标准JOIN语法编写查询:

select * 
from a join 
    b 
    on a.ACCOUNT_NUMBER = b.ACCOUNT_NUMBER AND 
     TRUNC(a.CREATE_DATE) BETWEEN b.START_DATE AND b.END_DATE; 

然后,我会倾向于对a(ACCOUNT_NUBMER, CREATE_DATE)b(ACCOUNT_NUMBER, START_DATE, END_DATE)创建索引。由于TRUNC(),您可能需要考虑可以在查询和索引中使用的虚拟列。

您的查询可能会返回太多的数据,以至于性能的限制因素不是查询本身,而是结果集。你的两个表格相当大,查询中没有太多的过滤。