我有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
关于如何改进它的任何想法?(索引,分区,另一种连接) 任何想法都会受到欢迎。
答案 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()
,您可能需要考虑可以在查询和索引中使用的虚拟列。
您的查询可能返回的数据太多,以至于性能限制因素不是查询本身而是结果集。您的两个表格相当大,查询中没有太多过滤。