- 浏览: 1505318 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
oracle执行计划解释
一.相关概念
1·rowid,伪列:就是系统自己给加上的,每个表都有一个伪列,并不是物理存在。它不能被修改,删除,和添加,rowid在该行的生命周期是唯一的,如果向数据库插入一列,只会引起行的变化,但是rowid并不会变。
2·recursive sql概念:当用户执行一些SQL语句时,会自动执行一些额外的语句,我们把这些额外的SQL语句称为“recursive calls” 或者是“recursive sql statement”,当在执行一个DDL语句时,Oracle总会隐含的发出一些Recursiv sql语句,用于修改数据字典,如果数据字典没有在共享内存中,则就执行“resursive calls”,它会把数据字典从物理读取到共享内存。当然DML和select语句都可能引起recursive SQL。
3·row source 行源:在查询中,由上一操作返回的符合条件的数据集,它可能是整个表,也可能是部分,当然也可以对2个表进行连接操作(join)最后得到的数据集
4·predicate:一个查询中的where限制条件
5·driving table 驱动表:该表又成为外层表,这个感念用于内嵌和HASH连接中,如果返回数据较大,会有负面影响, 返回行数据较小的适合做驱动表
6·probed table 被探查表:该表又称为内层表,我们在外层表中取得一条数据,在该表中寻找符合连接的条件的行。
7·组合索引(concatenated index)由多个列组成的索引,在组合索引中有一个重要的概念,就是引导索引,
create index idx_tab on tab(col1,col2,col3),
indx_tab则称为组合索引,
col1则称为引导列
在查询条件where后,必须使用引导索引,才会使用该组合索引
8.可选择性(selectivity)比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。 如果该列的“唯一键的数量/表中的行数”的比值越接近1,则该列的可选择性越高,该列就越适合创建索引,同样索引的可选择性也越高。在可选择性高的列上进 行查询时,返回的数据就较少,比较适合使用索引查询。
二.Oracle访问数据的存取方法
1.全表扫描(Full tabel scans,FTS)
为了实现全表扫描,Oracle读取数据库中的每一行,并检查每一行是否满足语句的where限制条件一个多块读操作,可以使io能读取多块数据块。减少了IO次数,提高了系统的吞吐量。在多块读的方法的使用下,可以高效的实现数据库全表扫描,而且,中有在全表扫描的情况下,在可以使用多块读的方法。在这个种访问模式下,数据块只读一次。
【注意】
使用FTS的前提是,在较大的表中,不建议使用FTS,除非取出的数据较多,超过总量的5%-10%,或者使用并行查询时
2.通过rowid的表存取
行的ROWID指向了该行的数据文件,数据块,以及在数据块中的位置,使用rowid能快速的定位到要取得数据的行上,在Oracle中,这是取得单行最快的方式。
【注意】
该存取方法,不会用到多块读操作,一次IO只能读取一个数据块。
3.索引扫描(index scan 和 index lookup)
索引扫描时通过index查找到对应行的rowid,然后通过rowid从数据库中得到具体的数据。该方法分为两个步骤,
(1)扫描索引得到得到rowid
说明:索引中不止储存着索引值,还存放的行的rowid
(2)通过rowid得到表中的数据
【注意】
1.由于索引经常使用,因此绝大多数都Cache到内存当中,所以第一步通常是逻辑IO,即数据可以从内存中取得
2.但是对第二步来说,如果数据比较大,就不可能存放在内存,因此是个物理操作,是极其耗时间的,因此,从大表中
进行索引扫描,如果数量大于总数的5%-10%,则效力会下降很多
3.如果索引的数据都能在内存中能找到,就可以避免第二步操作,避免了不必要的IO。效力会很高。
4.如果SQL语句会对索引排序,因为索引已经预先排好了序,索引在执行计划中不需要在对索引排序。根据索引的类型与where限制条件的不同,有4种数据类型的索引
1.唯一索引(index unique scan)
通过唯一索引查找一个数值,通常是rowid,如果表中存在unique,或者是primary key的话,Oracle通常实现唯一索引;
2.索引范围扫描(index range scan)
如果要取得多行数据,通常在唯一索引上加上范围操作,例如(>,<)
*使用index rang scan的三种情况
(a)在唯一索引上有where条件筛选
(b)在组合索引上,使用部分列进行查询,导致查询出多行
(c)对非唯一 索引列进行的任何查询
3.索引全扫描(index full scan)
与全表扫描想对应的就是全索引扫描,它必要保证要取得的数据都从索引中直接得到
例:
Index BE_IX is a concatenated index on big_emp (empno, ename)
SQL> explain plan for select empno, ename from big_emp order by empno,ename;
4.索引快速扫描(index fash full scan)
索引快速扫描和index full scan相似,不会对查询出的数据进行排序。
三.表之间的连接
根据row source连接的条件不同,可以分为等值连接(where a.col3=b.col4)非等值连接(where a.col3>b.col4)外连接 (where a.col3=b.col4(+))
1.典型的连接类型
(a)排序--合并连接(sort merge join,SMJ)
(b)嵌套循环(nested loops,NL)
(c)哈希连接(hash join,)
A.排序--合并连接
1)首先生成row source1需要的数据,让后对连接关联的列进行排序。
2)然后生成row source2需要的数据,然后对这些数据按照与row socurce1相对应的操作关联列进行排序。
3)将两边排好序的数据进行合并操作,将2个row source按照连接条件连接起来。
[注意]
·.如果row source已经在关联上列上被排序,那个连接操作就不会执行sort操作,将大大的提高效率,因为排序时极其 消耗资源的,预先被排序的row source包括索引,或者已经排好序的列。
·.排序是非常耗时的操作,尤其是大表,基于这个原因,SMJ通常不是一个好的解决办法,如果排序的工作早已做好那将极大的提高效率
·.对于非等值连接,这种连接方式的效率是比较高的。
B.嵌套循环。
在连接有驱动表的概念,实际上连接过程就是2层嵌套循环,外层表越小越好。
[执行原理]
从内部表来看,需要得到外层表的每一行,去匹配内部表的所有行,因此保持外部表尽可能小,和高效率访问内部表,是连接性能的关键。
[优点]
nested loops可以返回已经连接的行,而不必等待所有的行连接完,因此能快速响应,特别适合用在需要快速响应的语句中。
C.hash join
较小的row source用来构建hash table和bitmap,而第二个用来被hansed,并与第一个生成的hash table进行匹配。
bitmap用来作为一种较快查询的方法,用来检查hash table是否有匹配的行,特别在表大的情况下,不能容纳在内存中,这个连接方法非常有效。这个链接,也有驱动表的概念,有来构造hash table,bitmap的表叫驱动表,如果被 构建的hash table,bitmap都能容纳在内存中,这个效率非常高。
【注意】
1) 要使哈希连接有效,需要设置HASH_JOIN_ENABLED=TRUE,缺省情况下该参数为TRUE,另外,不要忘了还要设置 hash_area_size参数,以使哈希连接高效运行,因为哈希连接会在该参数指定大小的内存中运行,过小的参数会使哈希连接的性能比其他连接方式还要低。
2)只能用于等值连接。
3)在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。
解释结果:
1.AND-EQUAL 该步骤具有两个或更多个子步骤,每一个子步骤返回一系列的ROWID.AND-EQUAL操作选择的是索引子操作返回的rowid
2.BITMAP
conversoin to rowids --将位图从位图索引转换成可以用于提取实际资料的一系列的ROWID
conversoin from rowids --将一系列的ROWID转换成位图表示
conversoin count --对位图的行数进行统计
index single scan --为单个索引提取位图
index range scan --返回的位图是一定范围的关键值
index full scan --扫描整个位图索引
MERGE --合并两个位图,并作为一个位图返回结果
Minus --该操作是merge的相反操作,而且可以具有两个或3个子操作并返回位图
第一个子操作返回的位图用作起点,第一个位图减去第二个位图中提供所 有行。如果第二个位图为空,那么所有的null列也将被减去。
or --将两个位图作为输入
3.connect by --分层提取行,因为查询采用了CONNECT BY C从句
4.concatenaction --合并多个行集为一行。
5.count --计算从表中选择的行数
stopkey --计算的行数被查询语句中的where 中的 rownum所限制
6.filter --将一系列的行数作为输入,并过滤到where从句查询而得到的结果
7.first row --提取查询结果集的第一行
8.for udpate -- 为提取的行加锁。
9.hash join --使用散列连接法连接两张表
10.index
unique --从索引中查找唯一值
range scan --从一定范围中查找,是按照升序的方式
range scans desc --扫描行在一定范围之内,但是是按照降序的方式
11.inlist iterator --在in谓词中为一个值执行一次或者多次操作
13 intersection --将两个结果集合并成一个集,并返回在它们之间出现的共同的值
14 merger join --提供共同值,用来连接两个结果集的结果。是内连接
output --外
anit --反
seml --半
15 nested loops --该操作涉及到2个子操作,第一操作个返回一个行集,被用于行集中的每一行,执行第二个子操作。
output --用于执行外部套嵌套循环
16 partition [分区] --执行一或者多个分区操作,partition-start,partition-stop将提供分区的范围
singnal --显示操作将在单个分区上执行
iterator --在许多个分区中执行
all --显示操作将在所有分区上执行
inlist --显示操作在分区上执行,并用IN谓词驱动
17 projection --采用多个查询作为输入,并返回单个记录集。常和intersection,minus, unqie使用
18 sort
aggregate --在行集上采用分组函数
unique --对行集排序,去掉重复的行
join -- 和merger相同
group up -- 分组排序
orday by --按照orday by进行排序
19 table access
full --显示指定表中的所有行
cluster --与特定索引键进行匹配的所有行
hash --散列
by rowid --显示oracle表将从rowid提取
20 unqie 显示两个集,并去掉重复行
21 view 产生视图,并返回结果行集。
发表评论
-
SQL查询顺序处理
2011-09-15 11:29 1637select的解析执行顺序1. from语句 2. where ... -
概念模型、逻辑模型、物理模型区别
2011-09-08 10:48 1244http://wenku.baidu.com/view/9a6 ... -
规范化-数据库设计原则
2011-09-07 10:41 1460简介: 关系数据库设计的核心问题是关系模型的设计。本文将结合具 ... -
数据库设计准则(第一、第二、第三范式说明)
2011-09-07 10:17 1286I、关系数据库设计范式 ... -
oracle日志文件及归档日志模式
2011-09-01 10:18 1764oracle数据库中分为联机日志文件和归档日志文件两种日志文件 ... -
Oracle重做日志管理
2011-09-01 09:50 1441Oracle重做日志操作是为了记录数据的改变,提供数据库 ... -
Oracle复制技术的分布式系统同步应用
2011-08-28 17:41 1296本文将结合一个实际案例,讲解Oracle复制技术在分布 ... -
oracle数据同步
2011-08-28 14:34 1001首先创建一个 dblink(dat ... -
Oracle 流复制(Stream Replication)
2011-07-20 10:37 5632Stream 是Oracle 的消息队列( ... -
表分区
2011-06-30 09:21 1682分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用 ... -
数据库大型应用解决方案总结(1)
2011-06-22 18:01 1397随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设 ... -
oracle_SQL中ROWID与ROWNUM的使用
2011-06-16 10:51 1430对于 Oracle 的 rownum 问题,很多资料都说不支持 ... -
oracle函数手册
2011-06-08 09:22 1191SQL中的单记录函数1.ASCII ... -
oracle基础文档
2011-06-03 09:10 1246oracle基础文档 -
ORACLE 找回误删的数据库
2011-06-02 14:14 1376同事找回时操作的数据库为oracle 10g , 之前删除方式 ... -
为什么Oracle有时会用索引来查找数据?--强制Oracle使用最优的“执行计划”
2011-06-01 09:04 1746[摘要] 在你运用SQL语言,向数据库发布一条查询语句时,O ... -
sql编程规范与性能
2011-05-31 08:40 1282sql编程规范与性能 -
Nested Loops Join(嵌套连接)
2011-04-13 16:21 11590说明:最近找到了一个 ... -
oracle中分析sql语句执行计划的方法
2011-01-14 15:36 2233如何生成explain plan? 解答:运行utl ... -
oracle sql 语句(二)
2010-12-10 09:17 145127建立序列:(注意,这里并没有出现说是哪个表里面的序列 ...
相关推荐
"Oracle 执行计划详解" Oracle 执行计划是数据库性能优化的关键。为了更好地理解和优化 Oracle 数据库的执行计划,我们需要了解执行计划的生成过程、优化方法和执行计划的解读方法。 执行计划生成过程 执行计划的...
Oracle执行计划参数解释,Oracle SQL优化的基础是看懂Oracle的执行计划,本文当系统整理了Oracle执行计划里面的各种参数。
Oracle 执行计划解读 Oracle 执行计划是一种查询执行路径的表示形式,它展示了 Oracle 数据库在执行查询时访问数据的路径。下面是 Oracle 执行计划的详细解读,包括执行计划的定义、访问数据的方式、执行计划层次...
Oracle 执行计划详解 Oracle 执行计划是指 Oracle 数据库在执行查询语句时所采取的访问路径。了解执行计划对于优化查询语句、提高数据库性能至关重要。 什么是执行计划 执行计划是 Oracle 数据库在执行查询语句时...
oracle 执行计划详解 Oracle 执行计划是数据库性能调整的关键部分,对于想要学习 Oracle 数据库的朋友非常有帮助。下面是Oracle 执行计划的背景知识和重要概念。 共享 SQL 语句 Oracle 将 SQL 语句及解析后得到的...
### Oracle执行计划分析 #### 一、概述 在Oracle数据库管理中,优化SQL查询性能是一项至关重要的任务。其中,理解并分析SQL执行计划是提升查询效率的关键步骤之一。执行计划是指Oracle数据库根据特定的SQL语句所...
Oracle执行计划详解,包括oracle执行顺序和索引详细介绍
总之,Oracle执行计划的稳定性与数据库性能紧密相关,理解并掌握优化器的工作原理以及如何控制执行计划的选择,是优化数据库性能的关键。在基于代价的优化器模式下,虽然存在执行计划不稳定的可能,但通过合理管理和...
Oracle执行计划是数据库管理系统在处理SQL语句时的预估工作流程,它是Oracle优化器根据当前数据分布、索引情况和系统资源等信息选择的最佳执行策略。了解和分析执行计划对于提升SQL语句的性能至关重要。 一、生成...
### Oracle如何使用AUTOTRACE查看执行计划 在Oracle数据库管理中,查看SQL语句的执行计划是一项重要的技能,这有助于优化查询性能、诊断性能问题等。AUTOTRACE是Oracle提供的一种强大的工具,用于自动展示SQL语句的...
### Oracle执行计划深入解析 #### 引言 在数据库领域,尤其对于大型企业级应用,Oracle数据库因其强大的功能和稳定性而被广泛采用。在Oracle中,执行计划是数据库优化器根据SQL语句特性生成的一系列步骤,用于指导...
本文将深入探讨Oracle的执行计划和表分区两个重要概念,以及它们如何影响数据库性能。 执行计划是Oracle数据库处理SQL查询的一种步骤序列,它详细描述了数据如何从表中提取、如何进行排序或聚合,以及如何返回到...
Oracle 执行计划是数据库管理系统在处理SQL查询时制定的一系列步骤,用于高效地检索和处理数据。它是Oracle数据库优化器(Optimizer)根据统计信息、成本估算和已存在的索引等信息生成的。优化器有两种主要的工作...
除了以上概念,Oracle执行计划还包括其他访问方法,如索引扫描(Index Scan)、索引唯一扫描(Index Unique Scan)、索引快速全扫描(Index Fast Full Scan)以及各种类型的连接操作,如嵌套循环(Nested Loop)、...
本文档详细解释了 ORACLE 的执行计划背景知识,包括共享 SQL 语句、执行计划的存储和共享、绑定变量的使用、执行计划的生成和共享、执行计划的优化等方面的内容。 一、共享 SQL 语句 ORACLE 对相同的 SQL 语句进行...
oracle执行计划详细解释
ORACLE 执行计划和 SQL 调优 ORACLE 执行计划和 SQL 调优是关系数据库管理系统中非常重要的概念。执行计划是 Oracle 优化器生成的,用于描述如何访问数据库中的数据的计划。execute plan 中包括了访问路径、表扫描...
ORACLE执行计划和SQL调优