- 浏览: 55981 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
yvonxiao:
这个的确好用,我记得我以前是自己写了个存储过程来解决这种递归问 ...
Oracle Start With Connect By
Oracle执行计划的相关概念:
Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。
Recursive sql:为了执行用户语句,系统附加执行的额外操作语句,譬如对数据字典的维护等。
Row source(行源):oracle执行步骤过程中,由上一个操作返回的符合条件的行的集合。
Predicate(谓词):where后的限制条件。
Driving table(驱动表):又称为连接的外层表,主要用于嵌套与hash连接中。一般来说是将应用限制条件后,返回较少行源的表作为驱动表。在后面的描述中,将driving table称为连接操作的row source 1。
Probed table(被探查表):连接的内层表,在我们从driving table得到具体的一行数据后,在probed table中寻找符合条件的行,所以该表应该为较大的row source,并且对应连接条件的列上应该有索引。在后面的描述中,一般将该表称为连接操作的row source 2.
Concatenated index(组合索引):一个索引如果由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。
可选择性:表中某列的不同数值数量/表的总行数如果接近于1,则列的可选择性为高。
Oracle访问数据的存取方法:
Full table scans, FTS(全表扫描):通过设置db_block_multiblock_read_count可以设置一次IO能读取的数据块个数,从而有效减少全表扫描时的IO总次数,也就是通过预读机制将将要访问的数据块预先读入内存中。只有在全表扫描情况下才能使用多块读操作。
Table access by rowed(通过rowid存取表,rowid lookup):由于rowid中记录了行存储的位置,所以这是oracle存取单行数据的最快方法。
Index scan(索引扫描index lookup):在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的rowid值,索引扫描分两步1,扫描索引得到rowid;2,通过 rowid读取具体数据。每步都是单独的一次IO,所以如果数据经限制条件过滤后的总量大于原表总行数的5%-10%,则使用索引扫描效率下降很多。而如果结果数据能够全部在索引中找到,则可以避免第二步操作,从而加快检索速度。
根据索引类型与where限制条件的不同,有4种类型的索引扫描:
Index unique scan(索引唯一扫描):存在unique或者primary key的情况下,返回单个rowid数据内容。
Index range scan(索引范围扫描):1,在唯一索引上使用了range操作符(>,<,<>,>=,<=,between);2,在组合索引上,只使用部分列进行查询;3,对非唯一索引上的列进行的查询。
Index full scan(索引全扫描):需要查询的数据从索引中可以全部得到。
Index fast full scan(索引快速扫描):与index full scan类似,但是这种方式下不对结果进行排序。
目前为止,典型的连接类型有3种:
Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序;然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序;最后两边已经排序的行被放在一起执行合并操作。排序是一个费时、费资源的操作,特别对于大表。所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序,则这种连接方法的效率也比较高。
Nested loops(NL嵌套循环):连接过程就是将driving table和probed table进行一次嵌套循环的过程。就是用driving table的每一行去匹配probed table 的所有行。Nested loops可以先返回已经连接的行,而不必等待所有的连接操作处理完成才返回数据,这可以实现快速的响应时间。
Hash join(哈希连接):较小的row source被用来构建hash table与bitmap,第二个row source用来被hashed,并与第一个row source生产的hash table进行匹配。以便进行进一步的连接。当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。但需要设置合适的hash_area_size参数且只能用于等值连接中。
Cartesian product(笛卡尔积):表的每一行依次与另外一表的所有行匹配。
Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。
Recursive sql:为了执行用户语句,系统附加执行的额外操作语句,譬如对数据字典的维护等。
Row source(行源):oracle执行步骤过程中,由上一个操作返回的符合条件的行的集合。
Predicate(谓词):where后的限制条件。
Driving table(驱动表):又称为连接的外层表,主要用于嵌套与hash连接中。一般来说是将应用限制条件后,返回较少行源的表作为驱动表。在后面的描述中,将driving table称为连接操作的row source 1。
Probed table(被探查表):连接的内层表,在我们从driving table得到具体的一行数据后,在probed table中寻找符合条件的行,所以该表应该为较大的row source,并且对应连接条件的列上应该有索引。在后面的描述中,一般将该表称为连接操作的row source 2.
Concatenated index(组合索引):一个索引如果由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。
可选择性:表中某列的不同数值数量/表的总行数如果接近于1,则列的可选择性为高。
Oracle访问数据的存取方法:
Full table scans, FTS(全表扫描):通过设置db_block_multiblock_read_count可以设置一次IO能读取的数据块个数,从而有效减少全表扫描时的IO总次数,也就是通过预读机制将将要访问的数据块预先读入内存中。只有在全表扫描情况下才能使用多块读操作。
Table access by rowed(通过rowid存取表,rowid lookup):由于rowid中记录了行存储的位置,所以这是oracle存取单行数据的最快方法。
Index scan(索引扫描index lookup):在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的rowid值,索引扫描分两步1,扫描索引得到rowid;2,通过 rowid读取具体数据。每步都是单独的一次IO,所以如果数据经限制条件过滤后的总量大于原表总行数的5%-10%,则使用索引扫描效率下降很多。而如果结果数据能够全部在索引中找到,则可以避免第二步操作,从而加快检索速度。
根据索引类型与where限制条件的不同,有4种类型的索引扫描:
Index unique scan(索引唯一扫描):存在unique或者primary key的情况下,返回单个rowid数据内容。
Index range scan(索引范围扫描):1,在唯一索引上使用了range操作符(>,<,<>,>=,<=,between);2,在组合索引上,只使用部分列进行查询;3,对非唯一索引上的列进行的查询。
Index full scan(索引全扫描):需要查询的数据从索引中可以全部得到。
Index fast full scan(索引快速扫描):与index full scan类似,但是这种方式下不对结果进行排序。
目前为止,典型的连接类型有3种:
Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序;然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序;最后两边已经排序的行被放在一起执行合并操作。排序是一个费时、费资源的操作,特别对于大表。所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序,则这种连接方法的效率也比较高。
Nested loops(NL嵌套循环):连接过程就是将driving table和probed table进行一次嵌套循环的过程。就是用driving table的每一行去匹配probed table 的所有行。Nested loops可以先返回已经连接的行,而不必等待所有的连接操作处理完成才返回数据,这可以实现快速的响应时间。
Hash join(哈希连接):较小的row source被用来构建hash table与bitmap,第二个row source用来被hashed,并与第一个row source生产的hash table进行匹配。以便进行进一步的连接。当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。但需要设置合适的hash_area_size参数且只能用于等值连接中。
Cartesian product(笛卡尔积):表的每一行依次与另外一表的所有行匹配。
发表评论
-
oracle 命令
2009-02-05 20:30 976一、ORACLE的启动和关闭 ... -
通过dbms_flashback找回误删除的数据收藏
2009-01-21 11:35 1342在使用DBMS_FLASHBACK时要首先注意以下几个事项: ... -
优化Oracle数据库性能收藏
2009-01-21 11:35 857优化策略 为了保 ... -
Oracle Start With Connect By
2009-01-21 11:33 1558Start With Connect By 是用来实现在一个 ... -
Oracle 表空间操作收藏
2009-01-21 11:32 997创建表空间: 1、递增 ... -
移动数据文件收藏
2009-01-21 11:32 726移动数据文件: 1、首先使要移动数据文件的表空间离线. ... -
Oracle 死锁会话处理收藏
2009-01-21 11:31 1138--查询所有的死锁: SELECT * FROM V$LOCK ... -
Oracle 9i 打开autotrace on 查看执行计划收藏
2009-01-21 11:31 13181.创建表,通过utlxplan脚本 SQL> @? ... -
如何启用sqlplus的AutoTrace功能收藏
2009-01-21 11:31 831通过以下方法可以把Autotrace的权限授予Everyone ... -
user和schema的区别:
2009-01-21 11:30 1016说穿了其实user是控制权限的,而schema是个容器,非所有 ... -
解决Oracle数据文件和日志文件丢失的问题收藏
2009-01-21 11:29 2079今天不小心误删除了数据库的数据文件和日志文件,在启动数据库时报 ... -
Oracle表段中的高水位线HWM收藏
2009-01-21 11:28 2600在Oracle数据的存储中, ... -
深入了解oracle的高水位(HWM)收藏
2009-01-21 11:26 2263说到HWM,我们首先要简要的谈谈ORACLE的逻辑存储管理.我 ... -
ORACLE 日志文件相关查询收藏
2009-01-21 11:25 11821.查询系统使用的是哪一组日志文件: select * fro ... -
ORACLE热备份恢复手册收藏
2009-01-21 11:22 2312概要 1.1. 本文的目的 为了模拟测试oracle热备份的 ... -
(转)windows命令行下启动oracle
2009-01-21 09:56 1500--总结启动命令如下: lsnrctl [start|stop ... -
小议分析函数中排序对结果的影响(一)
2009-01-12 13:24 895分析函数中经常会包括O ... -
ORACLE10g新特性——全局HASH分区索引
2009-01-12 13:23 1752在10g以前,Oracle的全局索引分区方法只有一种,即范围分 ... -
深入认识Oracle Supplemental logging
2008-12-22 18:35 3130对于有过逻辑standby,streams搭建体验的朋友,肯定 ... -
深入分析Oracle数据库日志文件
2008-12-22 15:19 972深入分析Oracle数据库日志文件 作者:程永新 发文时间: ...
相关推荐
在"深入浅出Oracle"这份资料中,读者可能将接触到Oracle的安装配置、数据库设计、SQL查询优化、存储结构、备份恢复策略、性能调优、安全性管理以及高级特性等内容。通过学习,无论是数据库管理员、开发人员还是系统...
源码,意味着我们可以接触到Oracle数据库的底层实现,这对于开发者和研究者来说是非常宝贵的资源。通过分析源码,可以理解其工作原理,进行定制化开发,或者解决特定的技术问题。不过,Oracle的源码并不是公开的,但...
在《Oracle Database 11g SQL》一书中,读者可以学到如何使用SQL语句执行数据检索、插入、更新和删除操作,同时也会接触到更高级的主题,如索引、视图、存储过程和触发器的创建与管理。 ### 学习目标与价值 本书...
无论是对于刚接触Oracle的新手,还是经验丰富的数据库管理员,这本书都是一个宝贵的资源,可以帮助他们更好地理解和利用Oracle数据库的强大功能,提升数据库的性能、安全性和可管理性。通过深入学习本书,DBA们可以...
10. **数据库维护计划**:理解定期维护的重要性,学习如何制定和执行数据库的维护计划,包括数据清理、统计信息收集等。 通过《Oracle Database 10g: 数据库管理 - 课堂练习 I 学生指南第1册》中的这些练习,学生...
根据提供的信息,我们可以总结出以下关于《傻瓜数据仓库系列:Oracle 11g For Dummies》的关键知识点...无论你是刚刚接触 Oracle 数据库的新手还是希望进一步提升技能的老手,这本书都能够为你提供有价值的指导和支持。
总之,通过本教程的详细介绍,即使是初次接触Oracle Enterprise Linux 6.2的用户也能顺利完成安装,并对系统的基础配置和磁盘管理有初步了解。这不仅有助于提高安装的成功率,还为后续的系统管理和应用开发奠定了...
在学习这个系列教程时,你将接触到以下几个关键概念: - 地图投影:理解不同的地图投影方式,以及它们对数据的影响。 - 数据模型:了解矢量和栅格数据的区别,以及如何选择合适的存储方式。 - 空间分析:学习缓冲区...
【JAVA轻松入门 源代码】是一个针对初学者的编程学习资源,主要涵盖了Java语言的基础概念和实践操作。这个压缩包包含的是与课程配套的实验源代码,通过这些代码,学习者可以直观地理解Java编程的基本语法和常用结构...
对于初次接触SDE的用户,理解其基本概念和操作至关重要。 1. **SDE简介**: SDE是Esri提供的一个中间件,它连接了GIS软件和数据库系统,如Oracle、SQL Server、PostgreSQL等,使得地理数据能够与传统结构化数据...
在这一章,你将学习如何使用Visual Basic与Oracle数据库进行通信,这涉及到设置Oracle客户端、建立连接字符串、执行SQL语句等。Oracle数据库特有的特性如PL/SQL、游标、触发器等也将被讲解,这些将帮助你开发跨平台...
精心挑选的主题让您广泛地接触到Java的基本概念,而不会让您因信息过多而不知所措。虽然本书不可能涵盖每一个Java概念,但请放心,在本书结束时,您应该可以轻松编写自己的Java程序。在书后,我们将一起编写一个案例...
### ADO第一次亲密接触:详解ADO使用方法 #### 一、引言 ADO(ActiveX Data Object)是Microsoft提供的一种用于访问数据的技术,它在OLE DB的基础上进一步简化了数据库访问的过程,使得开发者能够更加轻松地操作...
通过这份中文手册,读者可以轻松掌握SQL的基本语法和实例,提升在Oracle数据库中的SQL编写能力。 1. SQL基础概念: SQL,全称结构化查询语言,包括数据查询、数据操纵、数据定义和数据控制四大功能。它是标准的...
VB.NET还支持数据库操作,通过ADO.NET库可以轻松地连接到各种数据库,如SQL Server、Oracle等。在教程中,你可能还会接触到如何使用Dataset、DataTable、DataAdapter等对象进行数据操作。 最后,VB.NET与.NET ...
文章开头部分提到了很多用户初次接触ORACLE EBS时的困惑,以及社会上对于ORACLE EBS及其竞争对手SAP的不同看法。 **关键点**: - **用户困惑**:很多用户在初次使用ORACLE EBS时会感到不知所措,尤其是对于那些习惯...
ADO.NET是微软.NET框架下的一种数据访问技术,用于与各种数据库进行交互,包括关系型数据库如SQL Server,Oracle,以及XML数据源等。这个“ADO.NET课件相关资料”压缩包显然包含了丰富的学习资源,可以帮助我们深入...
它集成了ADO(ActiveX Data Objects),使得开发者可以轻松地连接和操作各种数据库,如Oracle、MySQL、SQL Server等。你将在学习中了解如何创建数据感知组件,实现数据绑定,以及如何执行SQL查询。 此外,Delphi的...
6. **了解安卓开发的基本概念**: 在开发过程中,你会接触到诸如Activity、Intent、Layout、XML资源文件、生命周期方法等概念。Activity是应用程序中的一个屏幕,Intent用于在组件之间传递消息,Layout是应用的用户...
在本教程中,你将学习到类、对象、封装、继承、多态这些面向对象的基本概念。同时,也会接触到异常处理、输入/输出流、集合框架等核心内容。Java的集合框架包括List、Set、Queue等接口,以及ArrayList、HashSet、...