Oracle-此查询可以优化吗?

时间:2018-10-19 20:03:10

标签: sql oracle

我想获取一组行的最后一个日期。性能更好的是:Query1或Query2:

查询1

select *
from(
select column_date
from table1 a join table2 b on a.column1=b.column1
where id= '1234'
order by column_date desc) c
where rownum=1

Query2

select column_date
from table1 a join table2 b on a.column1=b.column1
where id= '1234'
order by column_date desc

并在后端获取第一行。

或者也许还有另一种方法可以在Oracle中取得第一行?我知道通常子选择的表现不佳。这就是为什么我要删除子选择的原因。

我尝试过,但是没有得到预期的结果:

select column_date
from table1 a join table2 b on a.column1=b.column1
where id= '1234' and rownum=1
order by column_date desc

1 个答案:

答案 0 :(得分:1)

首先,您无法真正优化查询。查询始终由优化器重写,并且根据存在的数据量,索引等,查询可能会给出非常不同的结果。因此,如果查询速度很慢,则必须查看执行计划以查看发生的情况。而且,如果您查询的速度不慢,则不应该对其进行优化。

本质上,子选择没有问题。正如Wernfriend Domscheit所建议的那样,这将为您提供最小的column_date,我认为它位于table2中。

SELECT MIN( b.column_date ) 
  FROM table1 a 
 INNER JOIN table2 b on a.column1 = b.column1 
 WHERE a.id= '1234'

可以保证只给您一行。如果您不仅需要日期字段,还可以选择日期最少的行:

 SELECT a.*, b.column_date
  FROM table1 a 
 INNER JOIN table2 b on a.column1 = b.column1 
 WHERE a.id= '1234'
   AND b.column_date = ( SELECT MIN( b2.column_date ) FROM table2 b2 )

但是,如果您的column_date不是唯一的,则可能会返回多行。如果可能的话,您将需要在数据中添加一些内容来区分要选择的行。这样可以保证单行:

SELECT * FROM (
     SELECT a.*, b.column_date
      FROM table1 a 
     INNER JOIN table2 b on a.column1 = b.column1 
     WHERE a.id= '1234'
       AND b.column_date = ( SELECT MIN( b2.column_date ) FROM table2 b2 )
     ORDER BY a.some_other_column 
)
WHERE ROWNUM = 1

在最新版本的Oracle中,您可以使用FETCH FIRST 1 ROW ONLY代替ROWNUM查询。我认为这没有什么影响。