A Study of Inline View and Analytic Function

show rel
release 1102000300

desc orders;
Name         Null Type         
------------ ---- ------------
ORDER_ID          NUMBER(38)   
CREATE_DATE       DATE         
CUSTOMER_ID       NUMBER(19)   
TOTAL_AMOUNT      NUMBER(38,3)

insert into orders
select level, trunc(sysdate - mod(level, 31)), mod(level, 100), mod(level, 1000)
from dual connect by level < div>
commit;
EXEC  DBMS_STATS.GATHER_TABLE_STATS(user, 'ORDERS',cascade=<true);


Orders表里有1万个订单,属于100个客户,这些订单生成于最近31天内。求每个客户订单金额最高的订单生成日期!先看inline view形式的SQL:
select orders.create_date, orders.customer_id, orders.total_amount
from orders,
  (select max(total_amount) highest, customer_id
   from orders group by customer_id) hh
where orders.total_amount=hh.highest;


-------------------------------------------------------------------------------------------------
| Id  | Operation            | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |        |       |       |    16 (100)|          |
|*  1 |  HASH JOIN           |        |  1000 | 28000 |    16  (13)| 00:00:01 |
|   2 |   VIEW               |        |   100 |  1300 |     8  (13)| 00:00:01 |
|   3 |    HASH GROUP BY     |        |   100 |   700 |     8  (13)| 00:00:01 |
|   4 |     TABLE ACCESS FULL| ORDERS | 10000 | 70000 |     7   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL  | ORDERS | 10000 |   146K|     7   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("ORDERS"."TOTAL_AMOUNT"="HH"."HIGHEST")

再观察使用分析函数的SQL:

SELECT * FROM (
  select create_date,
       customer_id,
       total_amount,
       RANK() over(partition by customer_id order by total_amount desc) rank
from orders)
WHERE RANK=1;



-----------------------------------------------------------------------------------
| Id  | Operation                | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |        |       |       |     8 (100)|          |
|*  1 |  VIEW                    |        | 10000 |   468K|     8  (13)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|        | 10000 |   146K|     8  (13)| 00:00:01 |
|   3 |    TABLE ACCESS FULL     | ORDERS | 10000 |   146K|     7   (0)| 00:00:01 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("RANK"=1)
   2 - filter(RANK() OVER ( PARTITION BY "CUSTOMER_ID" ORDER BY
              INTERNAL_FUNCTION("TOTAL_AMOUNT") DESC )< div>

在这里,分析函数性能优于inline view,由于不用做hash连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值