- 浏览: 56824 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
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 1011一、ORACLE的启动和关闭 ... -
通过dbms_flashback找回误删除的数据收藏
2009-01-21 11:35 1346在使用DBMS_FLASHBACK时要首先注意以下几个事项: ... -
优化Oracle数据库性能收藏
2009-01-21 11:35 890优化策略 为了保 ... -
Oracle Start With Connect By
2009-01-21 11:33 1572Start With Connect By 是用来实现在一个 ... -
Oracle 表空间操作收藏
2009-01-21 11:32 1009创建表空间: 1、递增 ... -
移动数据文件收藏
2009-01-21 11:32 736移动数据文件: 1、首先使要移动数据文件的表空间离线. ... -
Oracle 死锁会话处理收藏
2009-01-21 11:31 1172--查询所有的死锁: SELECT * FROM V$LOCK ... -
Oracle 9i 打开autotrace on 查看执行计划收藏
2009-01-21 11:31 13331.创建表,通过utlxplan脚本 SQL> @? ... -
如何启用sqlplus的AutoTrace功能收藏
2009-01-21 11:31 847通过以下方法可以把Autotrace的权限授予Everyone ... -
user和schema的区别:
2009-01-21 11:30 1053说穿了其实user是控制权限的,而schema是个容器,非所有 ... -
解决Oracle数据文件和日志文件丢失的问题收藏
2009-01-21 11:29 2102今天不小心误删除了数据库的数据文件和日志文件,在启动数据库时报 ... -
Oracle表段中的高水位线HWM收藏
2009-01-21 11:28 2633在Oracle数据的存储中, ... -
深入了解oracle的高水位(HWM)收藏
2009-01-21 11:26 2273说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我 ... -
ORACLE 日志文件相关查询收藏
2009-01-21 11:25 11931.查询系统使用的是哪一组日志文件: select * fro ... -
ORACLE热备份恢复手册收藏
2009-01-21 11:22 2332概要 1.1. 本文的目的 为了模拟测试oracle热备份的 ... -
(转)windows命令行下启动oracle
2009-01-21 09:56 1529--总结启动命令如下: lsnrctl [start|stop ... -
ORACLE10g新特性——全局HASH分区索引
2009-01-12 13:23 1763在10g以前,Oracle的全局索引分区方法只有一种,即范围分 ... -
深入认识Oracle Supplemental logging
2008-12-22 18:35 3143对于有过逻辑standby,streams搭建体验的朋友,肯定 ... -
深入分析Oracle数据库日志文件
2008-12-22 15:19 1000深入分析Oracle数据库日志文件 作者:程永新 发文时间: ... -
oracle 介绍
2008-09-20 21:04 1160第二章 架构 ORACLE架构由3部分组成: 文件, 内存结 ...
相关推荐
然而,在农业产业化的推进过程中,现行的金融制度在多个层面上对农业的发展产生了重要影响。 首先,现行的农村金融体系存在不足,缺乏专门针对农业产业化的金融机构和金融产品。农村地区传统的金融机构,如信用社、...
小议电脑病毒对网络安全的影响.doc
小议计算机病毒对网络安全的影响.doc
小议现代科技对传统美术的影响.doc
小议煤炭工业对城市规划的影响.doc
【文章标题】:小议会计准则对融资决策的影响 【文章描述】:本文探讨了新企业会计准则如何影响企业的融资决策,包括降低融资成本、改变资本结构等方面,并特别讨论了公允价值计量和可转换公司债券会计处理变化带来...
【小议奶牛营养对牛奶成分的影响】 奶牛的营养状况直接影响到牛奶的质量,从而影响乳制品的品质和销售,进一步关乎牧场和乳品企业的经济效益。牛奶中的主要成分,如乳蛋白、乳脂、乳糖等,是衡量牛奶质量的重要指标...
小议手机媒体对现代传媒业的影响(一).pdf
小议家庭教育对心理的影响诠释.doc
VLOOKUP函数是Excel中非常重要的一个查找与匹配工具,尤其在处理大量测量数据时,它的功能显得尤为突出。在测量工作中,数据处理是至关重要的环节,涉及到多种数据类型的整理、计算和分析。VLOOKUP函数能有效地解决...
小议外汇期权会计在新规则中的应用,是指对外汇期权的确认、计量、披露和应用的探讨。外汇期权是一种金融衍生工具,能够规避外汇风险,但其会计处理也存在一定的复杂性和挑战性。因此,企业需要对外汇期权的确认、...
本文将围绕年龄如何影响语言习得这一问题,结合关键期假说进行讨论,并分析此现象背后可能涉及的生理和心理因素。 关键期假说由神经语言学家伦尼伯格提出,该假说强调了儿童在特定年龄段内在语言习得方面的生理优势...
FDI(Foreign Direct Investment,外国直接投资)是中国经济发展中的重要因素,尤其在沿海地区,FDI的流入对中国产生了深远影响。FDI对东道国宏观经济的影响主要体现在以下几个方面: 1. 资本形成效应:FDI是弥补...
### 终身教育对学校教育的影响 #### 一、终身教育观念的起源与发展 终身教育的概念,虽然在古希腊、罗马、伊斯兰以及中国古代哲学中都有所体现,但在近现代才逐渐形成系统的理论并被广泛接受。例如,“活到老,学...
【土地流转对社会保障的影响】 土地流转是指农村集体土地的所有权不变的前提下,农户将土地使用权有偿或无偿转让给他人的现象。这一过程伴随着农村经济结构的调整和社会保障体系的变化。土地流转对社会保障产生的...
电力系统中的谐波分析是电力技术领域的重要议题,随着电力电子技术的发展,变频设备和其他非线性负载的广泛使用,谐波问题日益突出,对电能质量造成严重影响。谐波是指电力系统中频率为基波整数倍的电压或电流成分,...
小议电子商务对国际商务贸易合作的影响.doc
【绿色包装对我国出口贸易的影响】 1. 出口商品贸易额和市场受限:我国出口产品,尤其是农产品和初级产品,常常因为包装不符合发达国家的绿色标准,导致贸易额受损,出口市场相对缩小。例如,由于包装问题,我国的...
该文档是一篇关于探究大众传媒如何影响大学生环保观念的调查论文。文章首先阐述了调查的背景,指出环境保护已经成为全民性的问题,强调提高全民综合素质特别是培养环保意识的重要性。大学生作为未来社会的主力军,...
小议分析汉字文化信息改进汉字教学运用策略探析.pdf