Oracle Database 12c 新特性 - Native Top N 查询
在Oracle Database 12c之前,翻页查询需要试用rownum的方式进行SQL嵌套查询编写,这非常复杂,在12c中,新增了Top N查询支持特性,允许试用Offset / Limit 等限定进行Top N查询,原来的ROWNUM方式可以被替代。
其语法结构大致如下:
OFFSET
FETCH [FIRST | NEXT]
[
[ONLY | WITH TIES]
下图是文档语法结构图:
如果仅返回TOP 5%的记录,下图中的对比可以看到新语法和原有的查询语句之间的巨大差异:
这个新的功能在内部是通过ROW_NUMBER分析函数来实现的,语法类似如下查询,返回经过排序的TOP 5数据内容:
SQL> select object_id,object_name from eygle order by object_id
2 fetch first 5 rows only;
OBJECT_ID OBJECT_NAME
---------- --------------------------------------------------
2 C_OBJ#
3 I_OBJ#
4 TAB$
5 CLU$
6 C_TS#
跟踪查询的执行计划,可以看到,其使用的内部函数是ROW_NUMBER() 分析函数:
SQL> set autotrace on
SQL> set linesize 150
SQL> select object_id,object_name from eygle order by object_id
2 fetch first 5 rows only;
Execution Plan
----------------------------------------------------------
Plan hash value: 3708596342
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10000 | 1025K| | 118 (1)| 00:00:02 |
|* 1 | VIEW | | 10000 | 1025K| | 118 (1)| 00:00:02 |
|* 2 | WINDOW SORT PUSHED RANK| | 10000 | 224K| 328K| 118 (1)| 00:00:02 |
| 3 | TABLE ACCESS FULL | EYGLE | 10000 | 224K| | 46 (0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("from$_subquery$_003"."rowlimit_$$_rownumber"<=5)
2 - filter(ROW_NUMBER() OVER ( ORDER BY "OBJECT_ID")<=5)
Oracle的这一新特性是被期望已久的,这将结果长久以来程序员们极为头痛的翻页算法,福音所在!
建议继续学习:
- top 命令补充 ( VIRT RES SHR) (阅读:8060)
- top使用技巧 (阅读:6136)
- Linux进程管理命令详解(ps和top) (阅读:3071)
- Linux系统Load average负载详细解释 (阅读:2889)
- top监控命令在FreeBSD上的使用 (阅读:2480)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:eygle@eygle.com(eygle) 来源: Oracle Life
- 标签: Top
- 发布时间:2012-10-22 23:29:13
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [53] 如何拿下简短的域名
- [52] 图书馆的世界纪录
- [52] android 开发入门
- [50] Go Reflect 性能
- [50] Oracle MTS模式下 进程地址与会话信
- [48] 【社会化设计】自我(self)部分――欢迎区
- [47] 读书笔记-壹百度:百度十年千倍的29条法则
- [36] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑