日期:2014-05-17  浏览次数:20855 次

SQL查询效能优化

表结构:
SQL> desc m1
Name Type Nullable Default Comments 
------ ------------ -------- ------- -------- 
STATUS VARCHAR2(3) Y  
QTY NUMBER(20,5) Y  
DAT VARCHAR2(12) Y  

表数据(测试用):
SQL> SELECT * FROM M1;

STATUS QTY DAT
------ ---------------------- ------------
AAA 1.00000 20081208
AAA 1.00000 20081209
AAA 1.00000 20071209
BBB 1.00000 20070909
BBB 1.00000 20080909

SQL>

现在的需求是查询出STATUS为最小的,DAT为最大的那条记录

最终结果:
STATUS QTY DAT
------ ---------------------- ------------
AAA 1.00000 20081209


我的实现方法:
SELECT STATUS,QTY,DAT FROM (
  SELECT DISTINCT STATUS,QTY,MAX(DAT)OVER(PARTITION BY STATUS,QTY) DAT FROM M1) 
WHERE STATUS = (
  SELECT MIN(STATUS) FROM (
  SELECT DISTINCT STATUS,QTY,MAX(DAT)OVER(PARTITION BY STATUS,QTY) DAT FROM M1))

但是,由于表的数据量很大,我想请问除此之外有没有效能高点的查询方法
谢谢!

------解决方案--------------------

select STATUS,QTY,DAT FROM
select STATUS,QTY,DAT,rank () over (oder by status asc,dat desc) rk from m1)
where rk=1;