sql半连接优化

时间:2012-06-27 09:17:27

标签: sql oracle optimization semi-join

有两个表

t1 { id, name, ...}

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

t1和t2是oracle分区表。 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。 它真的很慢,有什么建议吗?

1 个答案:

答案 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 I我对Oracle的分区子语法一无所知。我希望可以完全删除分区(tx_partition_name),因为DBMS应该已经知道了。它也与“PARTITION BY”短语相撞。