2016-01-11 67 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(),您可能需要考慮可以在查詢和索引中使用的虛擬列。

您的查詢可能會返回太多的數據,以至於性能的限制因素不是查詢本身,而是結果集。你的兩個表格相當大,查詢中沒有太多的過濾。