1

有两张桌子

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。它真的很慢,有什么建议吗?

4

1 回答 1

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' )
     )
  ;

顺便说一句,我对 Oracle 的分区子语法一无所知。我希望可以完全删除分区(tx_partition_name),因为 DBMS 应该已经知道这一点。它还与“PARTITION BY”短语相冲突。

于 2012-06-27T09:23:59.387 回答