rownum或with子句之间的Oracle 10g性能

时间:2015-06-30 14:45:24

标签: sql oracle oracle10g

我正在使用Oracle Database 10g Enterprise Edition 10.2.0.4.0 64bit

我想知道,编写以下查询的最佳方法是什么?

1。使用rownum

SELECT * FROM
  (
  SELECT ID_DONNEE_H, DATE_DONNEE
  FROM DONNEE_H d
  WHERE d.DATE_DONNEE > sysdate -50000
  AND d.ID_SC = 38648
  ORDER BY DATE_DONNEE DESC
  )
  WHERE rownum=1;

2。使用WITH条款

with req as (
  select d.ID_DONNEE_H, row_number() over (order by DATE_DONNEE desc) as seqnum
  from DONNEE_H d
  where d.DATE_DONNEE > sysdate -50000
  AND d.ID_SC = 38648 ) 
select * from req where seqnum = 1;

第3。使用排名条款

select * from (select d.ID_DONNEE_H, row_number() over (order by DATE_DONNEE desc) as seqnum
  from DONNEE_H d
  where d.DATE_DONNEE > sysdate -50000
  AND d.ID_SC = 38648) test
  where seqnum = 1;

我认为2和3是相似的,但哪个是最快的,1,2或3?

1 个答案:

答案 0 :(得分:0)

我不认为你可以特别概括哪个查询是最好的"在所有情况下。与大多数IT问题一样,答案是:"它取决于"!您需要根据自己的优点调查每个查询。

顺便说一下,你错过了另一种选择 - 假设你只是在一个专栏之后,而不是你感兴趣的最高专栏的整行:

with sample_data as (select 10 col1, 3 col2 from dual union all
                     select 20 col1, 3 col2 from dual union all
                     select 30 col1, 1 col2 from dual union all
                     select 40 col1, 2 col2 from dual)
select max(col1) keep (dense_rank first order by col2 desc) col1_val_of_max_col2
from   sample_data;

COL1_VAL_OF_MAX_COL2
--------------------
                  20