2012-06-27 22 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