(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较

下午检查一段SQL时,发现获取最新数据时,可以采用两种方式的SQL写法:1、取记录后按日期逆序后取ROWNUM=1,2、对表的日期取MAX,再和原表关联,取出最大日期对应的数据。为了验证效率,做了以下实验。

数据量:
SELECT   COUNT ( * )
  
FROM  GPRXSJB
 
WHERE  GPDM  =   ' 000001 '
   
AND  FSRQ  <  TO_DATE( ' 2007-9-11 ' , ' YYYY-MM-DD ' )
结果为 4054行

SQL1(ROWNUM方式):
SELECT   *
  
FROM  
      (
        
SELECT  SPJ
          
FROM  GPRXSJB
         
WHERE  GPDM  =   ' 000001 '
           
AND  FSRQ  <  TO_DATE( ' 2007-9-11 ' , ' YYYY-MM-DD ' )
         
ORDER   BY  FSRQ  DESC
      ) 
 
WHERE  
ROWNUM 
=   1 ;
执行平均时间为:7.8 s

SQL2(MAX方式):
SELECT   *
  
FROM  GPRXSJB A,
      (                
        
SELECT   MAX (FSRQ)  AS  MAXDATE
          
FROM  GPRXSJB
         
WHERE  GPDM  =   ' 000001 '
           
AND  FSRQ  <  TO_DATE( ' 2007-9-11 ' , ' YYYY-MM-DD ' )
       ) B
 
WHERE  A.GPDM  =   ' 000001 '
   
AND  A.FSRQ  =  B.MAXDATE 
执行平均时间为:16 s

效率比较明细第一种要快得多。

可能原因分析:
按第二种方式,与原表关联的笛卡尔积维度较大,所以执行缓慢。
愿牛人们帮忙分析一下,谢谢。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值