- 浏览: 54708 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
yvonxiao:
这个的确好用,我记得我以前是自己写了个存储过程来解决这种递归问 ...
Oracle Start With Connect By
分析函数中经常会包括ORDER BY语句,而这个语句会对Oracle的运行结果产生影响。
看一个简单的例子:
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> INSERT INTO T VALUES (1, 'A');
已创建 1 行。
SQL> INSERT INTO T VALUES (3, 'C');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, 'B');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM T;
ID NAME
---------- ------------------------------
1 A
3 C
2 B
如果不加任何的排序,直接查询T表,Oracle根据记录读取的顺序返回记录,得到的结果是1、3、2。
下面加上带ORDER BY语句的分析函数:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 1
2 B 3
3 C 6
可以看到,加上分析函数之后,由于分析函数中ORDER BY的存在,改变了最终结果中的排列顺序。
下面将ORDER BY排序的字段改为倒排序:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
3 C 3
2 B 5
1 A 6
得到的最终结果也是倒序的,那么如果添加的分析函数,没有排序语句呢:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER() SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 6
3 C 6
2 B 6
这次得到结果的顺序就和没有添加分析函数时一样,Oracle根据记录的读取顺序返回了最终的结果。
如果分析函数中包括了ORDER BY语句,则分析函数在计算结果的过程中就会对ORDER BY指定列进行排序,否则就无法得到相应的结果,不过这个排序是基于窗口的。
当不指定窗口语句,也没有分区语句,那么参加排序就是所有的记录,因此Oracle根据ORDER BY语句中的顺序返回结果也就不奇怪了。
事实上,这种情况下,如果分析函数中的ORDER BY语句和SQL语句中的ORDER BY语句一致的话,Oracle可以节省一次排序操作。
SQL> SET AUTOT ON STAT
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1
4 FROM T
5 ORDER BY ID;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 1
2 B 3
3 C 6
统计信息
----------------------------------------------------------
4 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
572 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1
4 FROM T
5 ORDER BY ID;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 6
2 B 5
3 C 3
统计信息
----------------------------------------------------------
4 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
572 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
3 rows processed
从这里就可以清晰的看到,第一个SQL中分析函数与SQL的排序一致,整个SQL只执行了1次内存中的排序。
而第二个SQL中由于分析函数与SQL的排序不一致,所以统计信息中可以看到2次内存中的排序。
看一个简单的例子:
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> INSERT INTO T VALUES (1, 'A');
已创建 1 行。
SQL> INSERT INTO T VALUES (3, 'C');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, 'B');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM T;
ID NAME
---------- ------------------------------
1 A
3 C
2 B
如果不加任何的排序,直接查询T表,Oracle根据记录读取的顺序返回记录,得到的结果是1、3、2。
下面加上带ORDER BY语句的分析函数:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 1
2 B 3
3 C 6
可以看到,加上分析函数之后,由于分析函数中ORDER BY的存在,改变了最终结果中的排列顺序。
下面将ORDER BY排序的字段改为倒排序:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
3 C 3
2 B 5
1 A 6
得到的最终结果也是倒序的,那么如果添加的分析函数,没有排序语句呢:
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER() SUM1
4 FROM T;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 6
3 C 6
2 B 6
这次得到结果的顺序就和没有添加分析函数时一样,Oracle根据记录的读取顺序返回了最终的结果。
如果分析函数中包括了ORDER BY语句,则分析函数在计算结果的过程中就会对ORDER BY指定列进行排序,否则就无法得到相应的结果,不过这个排序是基于窗口的。
当不指定窗口语句,也没有分区语句,那么参加排序就是所有的记录,因此Oracle根据ORDER BY语句中的顺序返回结果也就不奇怪了。
事实上,这种情况下,如果分析函数中的ORDER BY语句和SQL语句中的ORDER BY语句一致的话,Oracle可以节省一次排序操作。
SQL> SET AUTOT ON STAT
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID) SUM1
4 FROM T
5 ORDER BY ID;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 1
2 B 3
3 C 6
统计信息
----------------------------------------------------------
4 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
572 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> SELECT ID,
2 NAME,
3 SUM(ID) OVER(ORDER BY ID DESC) SUM1
4 FROM T
5 ORDER BY ID;
ID NAME SUM1
---------- ------------------------------ ----------
1 A 6
2 B 5
3 C 3
统计信息
----------------------------------------------------------
4 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
572 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
3 rows processed
从这里就可以清晰的看到,第一个SQL中分析函数与SQL的排序一致,整个SQL只执行了1次内存中的排序。
而第二个SQL中由于分析函数与SQL的排序不一致,所以统计信息中可以看到2次内存中的排序。
发表评论
-
oracle 命令
2009-02-05 20:30 937一、ORACLE的启动和关闭 ... -
通过dbms_flashback找回误删除的数据收藏
2009-01-21 11:35 1320在使用DBMS_FLASHBACK时要首先注意以下几个事项: ... -
优化Oracle数据库性能收藏
2009-01-21 11:35 829优化策略 为了保 ... -
Oracle Start With Connect By
2009-01-21 11:33 1533Start With Connect By 是用来实现在一个 ... -
Oracle 表空间操作收藏
2009-01-21 11:32 971创建表空间: 1、递增 ... -
移动数据文件收藏
2009-01-21 11:32 693移动数据文件: 1、首先使要移动数据文件的表空间离线. ... -
Oracle 死锁会话处理收藏
2009-01-21 11:31 1093--查询所有的死锁: SELECT * FROM V$LOCK ... -
Oracle 9i 打开autotrace on 查看执行计划收藏
2009-01-21 11:31 12941.创建表,通过utlxplan脚本 SQL> @? ... -
如何启用sqlplus的AutoTrace功能收藏
2009-01-21 11:31 810通过以下方法可以把Autotrace的权限授予Everyone ... -
user和schema的区别:
2009-01-21 11:30 971说穿了其实user是控制权限的,而schema是个容器,非所有 ... -
解决Oracle数据文件和日志文件丢失的问题收藏
2009-01-21 11:29 2032今天不小心误删除了数据库的数据文件和日志文件,在启动数据库时报 ... -
Oracle表段中的高水位线HWM收藏
2009-01-21 11:28 2558在Oracle数据的存储中, ... -
深入了解oracle的高水位(HWM)收藏
2009-01-21 11:26 2240说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我 ... -
ORACLE 日志文件相关查询收藏
2009-01-21 11:25 11561.查询系统使用的是哪一组日志文件: select * fro ... -
ORACLE热备份恢复手册收藏
2009-01-21 11:22 2275概要 1.1. 本文的目的 为了模拟测试oracle热备份的 ... -
(转)windows命令行下启动oracle
2009-01-21 09:56 1467--总结启动命令如下: lsnrctl [start|stop ... -
ORACLE10g新特性——全局HASH分区索引
2009-01-12 13:23 1711在10g以前,Oracle的全局索引分区方法只有一种,即范围分 ... -
深入认识Oracle Supplemental logging
2008-12-22 18:35 3109对于有过逻辑standby,streams搭建体验的朋友,肯定 ... -
深入分析Oracle数据库日志文件
2008-12-22 15:19 952深入分析Oracle数据库日志文件 作者:程永新 发文时间: ... -
oracle 介绍
2008-09-20 21:04 1095第二章 架构 ORACLE架构由3部分组成: 文件, 内存结 ...
相关推荐
小议现行金融制度对农业的影响.doc
小议FDI及其集群对中国经济影响.doc
小议终身教育对学校教育的影响.docx
小议计算机病毒对网络安全的影响.doc
小议现代科技对传统美术的影响.doc
小议土地流转对社会保障的影响.doc
小议奶牛营养对牛奶成分的影响.doc
小议煤炭工业对城市规划的影响.doc
小议绿色包装对出口贸易的影响.doc
小议会计准则对融资决策的影响.doc
小议年龄对语言习得的影响.doc
小议手机媒体对现代传媒业的影响(一).pdf
小议家庭教育对心理的影响诠释.doc
小议传媒对环保观念的影响之调查.doc
小议电力系统中的谐波分析方法.pdf
小议电力系统参数变化对发电机组的影响.pdf
小议社会资本对个体知识分享的影响.doc
小议外汇期权会计在新规则中应用.doc
小议电子商务对国际商务贸易合作的影响.doc