改善加入效果

时间:2016-01-11 15:21:51

标签: sql oracle join

我有2张桌子,我需要加入。

都有很多记录。

其中一个表(表a)索引如下:account_number,start_date,end_date(all unique)。

第二个表未编入索引(表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

关于如何改进它的任何想法?(索引,分区,另一种连接) 任何想法都会受到欢迎。

1 个答案:

答案 0 :(得分: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(),您可能需要考虑可以在查询和索引中使用的虚拟列。

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