【问题标题】:sql semi join optimizesql半连接优化
【发布时间】:2012-06-28 16:40:47
【问题描述】:

有两张桌子

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

【问题讨论】:

  • 两个表上的分区方案是什么,是否有任何索引(全局/本地)?数据量是多少(基数、行大小)?
  • 删除distinct。它使用哈希来进行连接?可以发一下执行计划吗?
  • 执行计划会有帮助

标签: sql oracle optimization semi-join


【解决方案1】:

你可以试试:

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”短语相冲突。

【讨论】:

  • 我认为 Exists 等于 oracle 中的 in 子句。但我会试一试,谢谢。
  • 不,WRT NULL 是有区别的。 (取决于被比较事物的 NULLability。通常,它们是 PK+FK,因此(可能)NOT NULL。三值逻辑会导致很多问题)我不知道 oracle,但“防御性” ' 优化器将非常小心地在查询计划中“改组”可空/不可空术语。
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2018-03-24
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
相关资源
最近更新 更多