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

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

数据量:
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较SELECT COUNT(*)
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较  
FROM GPRXSJB
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较 
WHERE GPDM = '000001'
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较   
AND FSRQ < TO_DATE('2007-9-11','YYYY-MM-DD')
结果为 4054行

SQL1(ROWNUM方式):
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较SELECT *
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较  
FROM 
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较      (
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较        
SELECT SPJ
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较          
FROM GPRXSJB
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较         
WHERE GPDM = '000001'
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较           
AND FSRQ < TO_DATE('2007-9-11','YYYY-MM-DD')
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较         
ORDER BY FSRQ DESC
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较      ) 
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较 
WHERE 
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较ROWNUM 
= 1;
执行平均时间为:7.8 s

SQL2(MAX方式):
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较SELECT *
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较  
FROM GPRXSJB A,
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较      (                
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较        
SELECT MAX(FSRQ) AS MAXDATE
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较          
FROM GPRXSJB
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较         
WHERE GPDM = '000001'
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较           
AND FSRQ < TO_DATE('2007-9-11','YYYY-MM-DD')
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较       ) B
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较 
WHERE A.GPDM = '000001'
(ORACLE)ROWNUM方式与MAX方式在获取最新数据时的效率比较   
AND A.FSRQ = B.MAXDATE 
执行平均时间为:16 s

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

可能原因分析:
按第二种方式,与原表关联的笛卡尔积维度较大,所以执行缓慢。
愿牛人们帮忙分析一下,谢谢。
上一篇:JDK1.7新特性(3):java语言动态性之脚本语言API


下一篇:命令及文件