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

nzkunb0c  于 2023-08-04  发布在  Oracle
关注(0)|答案(3)|浏览(98)

我得到了一个查询,我试图从另一个表中获取最大(日期)值作为连接条件。

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
                  )

字符串
这里已经为effdt列创建了一个索引,但查询仍然需要很长时间才能返回值。任何帮助加入他们更好的将是伟大的。

w41d8nur

w41d8nur1#

使用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;

字符串

slwdgvem

slwdgvem2#

表c上的子查询,effdt上的索引是不够的。
(id, effdt)上的索引会做得更好。关键是在一个索引中覆盖where子句和max(effdt)函数。这与索引order by非常相似:http://use-the-index-luke.com/de/sql/sortieren-gruppieren/indexed-order-by

ghg1uchk

ghg1uchk3#

除了像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

字符串

相关问题