当用作内联查询连接条件时,使max()函数更快

时间:2016-05-10 06:05:03

标签: sql oracle greatest-n-per-group

我得到一个查询,我试图从另一个表中获取max(date)值作为连接条件。

SELECT a.col1, a.col2 
  FROM tablea a, 
       tableb b
 WHERE a.pk_id = b.fk_id
   AND a.effdt = (SELECT MAX(effdt)
                    FROM tablea c
                   where c.id= a.id
                     and c.effdt <= sysdate
                  )

此处已在tablea上为effdt列创建索引,但查询仍需要很长时间才能返回值。任何更好地加入他们的帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

使用RANK()分析函数消除相关的子查询:

SELECT *
FROM   (
  SELECT a.*,
         RANK() OVER ( PARTITION BY a.id ORDER BY a.effdt DESC ) AS rnk
  FROM   tablea a
         INNER JOIN
         tableb b
         ON ( a.pk_id = b.fk_id )
  WHERE  a.effdt <= SYSDATE
)
WHERE  rnk = 1;

答案 1 :(得分:0)

表c上的子查询,effdt上的索引是不够的。

(id, effdt)上的索引会做得更好。关键是在单个索引中覆盖where子句以及max(effdt)函数。这与索引order byhttp://use-the-index-luke.com/de/sql/sortieren-gruppieren/indexed-order-by

非常相似

答案 2 :(得分:0)

除了添加Markus建议的index之外,请尝试此操作。 IMO加入的工作比子查询更好(对于我尝试过的场景)

SELECT a.*
FROM tablea a
INNER JOIN tableb b 
 ON a.pk_id = b.fk_id
INNER JOIN 
   (SELECT MAX(effdt) AS effdt
    FROM tablea
    WHERE effdt <= sysdate
    ) c ON c.id = a.id
    AND c.effdt = a.effdb