`

[Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧

阅读更多
--1. 取前10

select * from hr.employees where rownum<=10


 --2. 按照first_name升序,取前10位
--正确方法 oracle处理机制: --> hr.employees全表扫描
                    --> SORT ORDER BY STOPKEY       只排序前10行,作为一个矩阵结构
                   -->剩下的行与第10行进行比较,合适的进入矩阵,否则抛弃
            --优点:RAM中少量排序,速度快(不需要在内存或者temp表空间进行全表排序), 并不真正排序整个结果集,但概念上做了整个结果集的排序
            --注意第一,二个rownum的区别

 

select rownum,t.* from (select rownum,employees.* from hr.employees order by first_name) t where rownum<=10

 
--执行计划
SELECT STATEMENT, GOAL = CHOOSE Cost=5 Cardinality=10 Bytes=15622 COUNT STOPKEY VIEW Object owner=SCOTT Cost=5 Cardinality=107 Bytes=15622 SORT ORDER BY STOPKEY Cost=5 Cardinality=107 Bytes=7276 COUNT TABLE ACCESS FULL Object owner=HR Object name=EMPLOYEES Cost=2 Cardinality=107 Bytes=7276

 
--返回的结果
ROWNUM ROWNUM EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL 1 22 121 Adam Fripp AFRIPP 2 97 196 Alana Walsh AWALSH 3 48 147 Alberto Errazuriz AERRAZUR 4 4 103 Alexander Hunold AHUNOLD 5 16 115 Alexander Khoo AKHOO 6 86 185 Alexis Bull ABULL 7 59 158 Allan McEwen AMCEWEN 8 76 175 Alyssa Hutton AHUTTON 9 68 167 Amit Banda ABANDA 10 88 187 Anthony Cabrio ACABRIO

 
--3.取第11-20
--推荐方法 COUNT STOPKEY --> 当查询到20行时执行了查询中止的命令 Cardinality=20
select t.* from (select /*+ First_rows */ rownum rnum,employees.* from hr.employees where rownum<=20) t where rnum>10

  SELECT STATEMENT, GOAL = CHOOSE Cost=2 Cardinality=20 Bytes=2920 VIEW Object owner=SCOTT Cost=2 Cardinality=20 Bytes=2920 COUNT STOPKEY TABLE ACCESS FULL Object owner=HR Object name=EMPLOYEES Cost=2 Cardinality=107 Bytes=7276

 
--不推荐方法   COUNT         --> 建立了整个结果集 Cardinality=107
select t.* from (select rownum rnum,employees.* from hr.employees) t where rnum between 11 and 20

  SELECT STATEMENT, GOAL = CHOOSE Cost=2 Cardinality=107 Bytes=15622 VIEW Object owner=SCOTT Cost=2 Cardinality=107 Bytes=15622 COUNT TABLE ACCESS FULL Object owner=HR Object name=EMPLOYEES Cost=2 Cardinality=107 Bytes=7276

 
-4. -当使用内嵌视图时, ORACLE优化程序可能会整合视图, 看下面那句sql语句的explain
select * from( select employees.* from hr.employees ) emp, (select departments.* from hr.departments ) dept where emp.department_id=dept.department_id

 
SELECT STATEMENT, GOAL = CHOOSE Cost=5 Cardinality=106 Bytes=9328 HASH JOIN Cost=5 Cardinality=106 Bytes=9328 TABLE ACCESS FULL Object owner=HR Object name=DEPARTMENTS Cost=2 Cardinality=27 Bytes=540 TABLE ACCESS FULL Object owner=HR Object name=EMPLOYEES Cost=2 Cardinality=107 Bytes=7276

 --如果觉得ORACLE所走的access path不是你想要或者说执行时间过长, 可以尝试在内嵌视图中增加rownum, 这个时候内嵌视图会被实体化(当作一个实体表), 这种情况下ORACLE优化程序无法整合视图! 可能会带来性能上的提升@!
select * from( select employees.*,rownum from hr.employees ) emp, (select departments.*,rownum from hr.departments ) dept where emp.department_id=dept.department_id

  SELECT STATEMENT, GOAL = CHOOSE Cost=5 Cardinality=106 Bytes=22790 HASH JOIN Cost=5 Cardinality=106 Bytes=22790 VIEW Object owner=TEST Cost=2 Cardinality=27 Bytes=1863 COUNT TABLE ACCESS FULL Object owner=HR Object name=DEPARTMENTS Cost=2 Cardinality=27 Bytes=540 VIEW Object owner=TEST Cost=2 Cardinality=107 Bytes=15622 COUNT TABLE ACCESS FULL Object owner=HR Object name=EMPLOYEES Cost=2 Cardinality=107 Bytes=7276

 

 
分享到:
评论

相关推荐

    Oracle课件.pdf

    PL/SQL程序设计 1. PL/SQL简介 2. PL/SQL基础 2.1声明 2.2条件控制 2.3循环控制 2.4游标 2.5动态SQL 3.创建存储过程 4.创建自定义函数 5.异常处理 6.同步数据 7.创建包 8.创建日志 第6章

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    Oracle字段上建立并使用索引 29 用Windows脚本宿主自动化Oracle工具 31 进程结构和内存结构 32 Oracle监控数据库性能的SQL汇总 36 Oracle如何精确计算row的大小 38 PL/SQL编程 39 数据库的分组问题 41 oracle知识 42...

    Oracle数据库速查知识文档,oracle使用手册

    oracle rownum,Oracle数据库速查知识文档,oracle基础使用、SQL基础、oracle函数、oracle触发器、oracle高级查询、PL/SQL编程基础、PL/SQL存储过程等

    oracle教案(doc)+SQL Reference 10g(chm).rar

    3.2.10 ROWNUM伪列(重点) 63 3.2.11 集合操作 65 3.2.12 连接查询及分组查询强化训练 68 3.3 数据库的更新操作 69 3.3.1 添加数据 69 3.3.2 添加数据的语法 69 3.3.3 修改数据 71 3.3.4 删除数据 71 3.3.5 事务处理 ...

    精髓Oralcle讲课笔记

    ------------------------/组函数(共5个):将多个条件组合到一起最后只产生一个数据------min() max() avg() sum() count()----------------------------/ 51、select count(*) from emp; --求出表中一共有多少条...

    Oracle sqldeveloper without jdk (win+linux)

    Oracle SQL Developer, v1.5.0.54.40 Release Notes 完整版下载:http://www.oracle.com/technology/global/cn/software/products/sql/index.html 1. Known Issues 1.1 General - Print prints only one page ...

    Oracle数据库学习指南

    2. Dual伪列 3. EXP、IMP 命令详解 4. Exp-Imp大量数据 5. Export-Import 使用技巧与常见错误 6. NULL 使用详解 7. Oracle for NT系统实用工具介绍 8. Oracle 和 mysql 的一些简单命令对比参照 9. Oracle8i和...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL语言主要包含5个部分  数据定义...

    SQL培训第一期

    伪列不是表的真实列,但是你可以象使用真实列一样使用伪列,常用伪列:rowid行的绝对物理编号,每一行是唯一的。rownum序号,返回查询结果的每行序号。系统时间sysdate,返回系统当前时间。 2.1.4.2 伪表 select * ...

    收获不止SQL优化

    13.1.5 使用10046 trace跟踪PL/SQL 368 13.2 PL/SQL优化其他相关扩展 369 13.2.1 编译无法成功 369 13.2.2 通用脚本分享 370 13.3 本章习题、总结与延伸 380 第14章 动手,高级写法应用让SQL飞 381 14.1 具体...

    merge_row_count:一个简单的实用程序,允许对由 Oracle 中的合并操作插入更新删除的行进行计数

    一个简单的实用程序 PL/SQL 包,允许对 Oracle 中的合并操作插入/更新/删除的行进行计数。 包的需要 Oracle不提供获取行数的功能。 插入 更新 已删除 使用 MERGE 操作完成所有操作时。 这个简单的实用程序是为了...

    oracle查看会话锁定的所有对象代码分享

    代码如下:select session_id sid, owner, name, type, mode_held... 您可能感兴趣的文章:ORACLE 查询被锁住的对象,并结束其会话的方法解析Oracle数据库中的对象集合schemaORACLE 常用的SQL语法和数据对象Oracle使用PL/

    Oracle事例

    sql&gt; create user juncky identified by oracle default tablespace users sql&gt; temporary tablespace temp quota 10m on data password expire sql&gt; [account lock|unlock] [profile profilename|default]; ...

    oracle入门到大神(备mysql、java基础、javaee必经之路)

    Oracle10g的安装、orcale的基本概念介绍、命令行常用操作、Scott用户下的表结构介绍、sql简介、简单查询、限定查询、对结果集排序、单行函数、多表查询、子查询、数据库变更、事务处理、表的管理、约束、rownum、...

    Java学习笔记-个人整理的

    {12.25}PL/SQL}{189}{section.12.25} {13}JDBC}{191}{chapter.13} {13.1}forName}{191}{section.13.1} {13.2}JDBC}{191}{section.13.2} {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{...

Global site tag (gtag.js) - Google Analytics