2012-06-27 45 views
1

有兩個表SQL半加入優化

t1 { id, name, ...} 

t2 { t1_id , date_time, parameter, value, ...} 

T1和T2是預言的分區表。 t2很大。

我要取的時間範圍從T2匹配T1:

select id, name, ... from t1 partition(t1_partition_name) 
where t1.id in(select distinct t1_id from t2 partition(t2_partition_name) 
      where date_time > to_date('20120627 00','YYYYMMDD HH24') 
        and date_time <to_date('20120627 12','YYYYMMDD HH24') 
     ) 

子查詢將返回10K左右t1_id。 它真的很慢,有什麼建議嗎?

+0

你在兩個表上的分區方案是什麼,你有任何索引(全局/本地)?數據量是多少(基數,行數)? –

+0

刪除'distinct'。它使用哈希來完成連接?你能發佈執行計劃嗎? –

+0

執行計劃會有幫助 –

回答

0

你可以嘗試:

SELECT id, name, ... 
    FROM t1 partition(t1_partition_name) aa 
WHERE EXISTS (
    SELECT * 
     FROM t2 partition(t2_partition_name) ex 
     WHERE ex.t1_id = aa.id 
     AND ex.date_time > to_date('20120627 00','YYYYMMDD HH24') 
     AND ex.date_time <to_date('20120627 12','YYYYMMDD HH24') 
    ) 
    ; 

BTW我不知道有關Oracle分區子語法什麼。我預計分區(tx_partition_name)可以完全刪除,因爲DBMS應該已經知道這一點。它也與「PARTITION BY」短語相沖突。

+0

我認爲Exists等於oracle中的從句。但我會嘗試一下,thx。 – ArdenZhao

+0

不,WRT NULLs有區別。 (取決於被比較對象的可空性),通常它們是PK + FK,因此(可能)不是NULL。三值邏輯可能導致很多問題)我不知道oracle,但是一個'防禦'優化器將非常小心「在查詢計劃中對」可空/不可空條件「進行混洗。 – wildplasser