读书笔记-《基于Oracle的SQL优化》-第一章-3

优化器:

1、优化器的模式:

用于决定在Oracle中解析目标SQL时所用优化器的类型,以及决定当使用CBO时计算成本值的侧重点。这里的“侧重点”是指当使用CBO来计算目标SQL各条执行路径的成本值时,计算成本值的方法会随着优化器模式的不同而不同。

Oracle中,优化器的模式是由参数OPTIMIZER_MODE的值来决定的。

RULE:表示Oracle将使用RBO来解析目标SQL,此时SQL中涉及的各个对象的统计信息对于RBO没有任何作用。

CHOOSE:Oracle 9i的默认值,表示RBO还是CBO取决于SQL涉及的表对象是否有统计信息。

FIRST_ROWS_n(n=1,10,100,1000):此时CBO计算SQL的各条执行路径的成本值时的侧重点在于以最快的响应速度返回头n(n=1,10,100,1000)条记录。

FIRST_ROWS:Oracle 9i中就已经过时的参数,当一些特殊情况下的时候,会使用RBO中的一些内置的规则来选取执行计划不再考虑成本。例如当发现能用相关的索引来避免排序,则会选择索引对应的执行路径不再考虑成本,显然是不合理的。这时,索引全扫描的概率比以前有所增加,因为用索引全扫描能避免排序。

ALL_ROWS:Oracle 10g及以后版本中OPTIMIZER_MODE的默认值,表示使用CBO解析目标SQL,此时CBO计算SQL的各条执行路径的成本值时的侧重点在于最佳的吞吐量(即最小的系统I/O和CPU资源的消耗量)。

2、结果集:

指包含指定执行结果的集合。对RBO来说,对应的执行计划中没有对相关执行步骤对应的结果集的描述,虽然结果集的概念对RBO也是适用的。对CBO来说,对应执行计划中的列(Rows)反映的就是CBO对应相关执行步骤所对应的输出结果集的记录数(Cardinality)的估算值。

3、访问数据的方法:

3.1 访问表的方法

全表扫描:

指Oracle访问目标表里的数据时,会从该表所占用的第一个区(Extent)的第一个块(Block)开始扫描,一直扫描到该表的高水位线(HWM),这段范围内所有的数据块都必须读到。

ROWID扫描:

指Oracle访问目标表里的数据时,直接通过数据所在的ROWID定位并访问这些数据。ROWID表示Oracle中的数据行记录所在的物理存储地址,也就是说ROWID实际上和Oracle中数据块里的行记录一一对应的。

ROWID扫描有两层含义:一种是根据用户在SQL语句中输入的ROWID的值直接访问对应的数据行记录;另外一种是先访问相关的索引,然后根据访问索引后得到的ROWID再回表访问对应的数据行记录。

对Oracle堆表而言,通过Oracle内置的ROWID伪列得到对应航记录所在的ROWID的值(注意:ROWID只是一个伪列,在实际的表块中并不存在该列),然后还可以根据DBMS_ROWID包中的相关方法(dbms_rowid.rowid_relative_fno、dbms_rowid.rowid_block_number和dbms_rowid.rowid_row_number)将上述ROWID伪列的值翻译成对应数据行的实际物理存储地址。

访问索引的方法:

(1)、索引唯一性扫描:INDEX UNIQUE SCAN,仅适用于where条件中是等值查询的目标SQL。因为扫描的对象是唯一性索引,所以索引唯一性扫描的结果至多只会返回一条记录。

(2)、索引范围扫描:INDEX RANGE SCAN,当扫描的对象是唯一性索引时,目标SQL的where条件一定是范围查询(谓词条件为BETWEEN、<、>等);当扫描的对象是非唯一性索引时,对目标SQL的where条件没有限制(可以是等值查询,也可以是范围查询)。

在同等条件下,当目标索引的索引行的数量大于1时,索引范围扫描所耗费的逻辑读至少会比相应的索引唯一性扫描多1。

(3)、索引全扫描:指要扫描目标索引所有叶子块的所有索引行。但并不意味着需要扫描该索引的所有分支块。默认情况下,Oracle在做索引全扫描时只需要通过访问必要的分支块定位到位于该索引最左边的叶子块的第一行索引行,就可以利用该索引叶子块之间的双向指针链表,从左至右依次顺序扫描该索引所有叶子块的所有索引行了。

按照索引键值顺序排序,即可达到排序的效果。避免真正的排序。

默认情况下,索引全扫描的有序性就决定了所以全扫描不能并行执行,通常使用单块读。

做索引全扫描的前提条件是目标索引至少有一个索引键值列的属性是NOT NULL。

索引快速全扫描:INDEX FAST FULL SCAN,需要扫描目标索引所有叶子块的所有索引行。

与索引全扫描的区别:

(1)、索引快速全扫描只适用于CBO。

(2)、索引快速全扫描可以使用多块读,也可以并行执行。

(3)、索引快速全扫描结果不一定是有序的。因为索引快速全扫描时Oracle是根据索引行在磁盘上的物理存储顺序来扫描,而不是根据索引行的逻辑顺序来扫描的。所以扫描结果才不一定有序(对于单个索引叶子块中的索引行而言,其物理存储顺序和逻辑存储顺序一致,但对于物理存储位置相邻的索引叶子块而言,块与块之间索引行的物理存储顺序则不一定在逻辑上有序。

索引跳跃式扫描:INDEX SKIP SCAN,它使那些在where条件中没有对目标索引的前导列指定查询条件但同时又对该索引的非前导列指定了查询条件的目标SQL依然可以用上该索引,这就像在扫描该索引时跳过了它的前导列。这是因为Oracle帮你对该索引的前导列的所有distinct值做了遍历。

Oracle中的索引跳跃式扫描仅适用于那些目标索引前导列的distinct值数量较少,后续非前导列的可选择性又非常好的情形,因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减。

表连接

当优化器解析含表连接的目标SQL时,它除了会根据目标SQL的SQL文本的写法来决定表连接的类型之外,还必须决定如下三件事情才能得到最终的执行计划。

(1)、表连接顺序

(2)、表连接方法

(3)、访问单表的方法

表连接类型:

(1)、内连接

只要where条件中没有写那些标准SQL中定义或者Oracle中自定义的表示外连接的关键字,则该SQL的连接类型就是内连接。

标准SQL中内连接的写法是用JOIN ON或者JOIN USING。

目标表1 join 目标表2 on (连接条件)

目标表1 join 目标表2 using (连接列集合)

注意:对于使用JOIN USING的标准SQL而言,如果连接列同时又出现在查询列中,则该连接列前不能带上表名或者表名的别名(alias),否则Oracle会报错(ORA-25154)。

特殊的JOIN USING,我们称之为NATURAL JOIN,使用NATURAL JOIN的表连接的连接列是表连接的两个表所有的同名列。

目标表1 natural join 目标表2

相当于:目标表1 join 目标表2 using (目标表1和目标表2的所有同名列集合)

(2)、外连接

左连接:目标表1 left outer join 目标表2 on (连接条件)

目标表1 left outer join 目标表2 u si n g (连接列集合)

left outer join左边的目标表1作为表连接的驱动表,即表明位置处于left的表就是outer table,驱动表。此时连接结果除了包含目标表1和目标表2中所有满足该连接条件的记录外,还会包含驱动表(目标表1)中所有不满足该连接条件的记录,同时,驱动表中所有不满足该连接条件的纪录所对应的被驱动表(目标表2)中的查询列均会以NULL值来填充。

右连接:目标表1 right outer join 目标表2 on (连接条件)

目标表1 right outer join 目标表2 using (连接列集合)

时间: 2024-11-09 06:06:44

读书笔记-《基于Oracle的SQL优化》-第一章-3的相关文章

读书笔记-《基于Oracle的SQL优化》-第一章-1

开始学习崔老师的<基于Oracle的SQL优化>,七百多页,虽然可能会比较痛苦,但想必是一个痛并快乐的过程,尽情享受了... 第一章:Oracle里的优化器 优化器是Oracle数据库中内置的一个核心子系统,可以理解为一个核心模块或者一个核心功能组件.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前情形下最搞笑的执行路径,也就是说,优化器的目的是为了得到目标SQL的执行计划. RBO内置的等级1所对应的的执行路径就是"single row by rowid(通过rowi

好书推荐—《基于Oracle的SQL优化》

这是一本全书都在讲SQL性能优化的书. 这是国内目前SQL优化最详尽的一本书. 读了这本书,你会发现,SQL优化其实不是感觉的那么难. 这本书挺厚,800多页,对比它的价格,100多人民币,物有所值. 崔华是在用心写书,轮扁斫轮,他尝试着把那些难以言明的宝贵的思想用文字表达出来. 当然,优化前必先基础扎实,一些基本概念都不懂,这本书比较难读. 网上讲优化的文档一搜一大堆,但文档终有其局限性--相对短小的身材难以容纳庞大的知识体系.文档作为知识补充的手段是极好的.

读书笔记-《基于Oracle的SQL优化》-第一章-2

CBO优化器的基本概念: 可传递性: 1.简单谓词传递 t1.c1=t2.c1 and t1.c1=10,Oracle会自动将t2.c1=10的条件添加. 2.连接谓词传递 t1.c1=t2.c1 and t2.c1=t3.c1,Oracle会自动将t1.c1=t3.c1的条件添加. 3.外连接谓词传递 t1.c1=t2.c1(+) and t1.c1=10,Oracle会自动将t2.c1(+)=10的条件添加. CBO的局限性: 1.CBO会默认目标SQL语句where条件中出现的各个列之间是

【书评:Oracle查询优化改写】第一章

[书评:Oracle查询优化改写]第一章     BLOG文档结构图:     之前帮助ITPUB上的一位博主修改过一个很明显的错误,ITPUB为了表达感谢特赠予一本技术方面的书籍,我可以自己选择书名,想了想,自己对SQL优化特感兴趣于是就订了一本SQL优化改写方面的书籍,书名为<Oracle查询优化改写>,其实这本书的作者我是认识的,之前数次在公开课上听过他讲过SQL优化改写方面的内容,印象很深刻,好了,不多说了,说多了有打广告的嫌疑. 最近一直在学习rac方面的内容,但是rac高可用性,这

基于CBO的SQL优化和Oracle实例优化

作者:朱培 ID:sdksdk0 SQL优化是数据优化的重要方面,本文将分析Oracle自身的CBO优化,即基于成本的优化方法.Oracle为了自动的优化sql语句需要各种统计数据作为优化基础.外面会通过sql的追踪来分析sql的执行过程,消耗的资源信息.对于数据库的性能问题往往是在系统部署一段时间之后出现的,即大量用户开始使用该系统,系统的数据处理量和各种计算复杂性增加的时候,这个时候往往会追溯到系统的初始设计阶段,所以我们还是要在编码阶段就编写高效的sql语句.我在网上看到了很多关于sql优

091025 L DNA读书笔记

读书笔记和读后感 02 如何开始第一个工作     大企业,有很多好处.它与小企业的不同在于,小企业的竞争是对外的,而大企业的竞争则是来自于内部的.选择进入大企业的人,一定要有一个目标,多年后做到某个位置的目标.大企业适合喜欢跟同事竞争的人工作.     小企业,坏处是没有大企业的待遇好,不过可以学会更多的本领.     政府机关,如果选择到这里工作,那就是一个比较稳定的工作.在这里,如果比别人更勤奋的话,爬得也比别人快.     自由职业,如果选择这种方式工作,那么需要人有比较高的自我管控能力

【书评:Oracle查询优化改写】第二章

[书评:Oracle查询优化改写]第二章   BLOG文档结构图       在上一篇中http://blog.itpub.net/26736162/viewspace-1652985/,我们主要分析了一些单表查询的时候需要注意的内容,今天第二章也很简单,主要是关于排序方面的内容,以下贴出第二章的内容: 第 2 章 给查询结果排序 2.1 以指定的次序返回查询结果 2.2 按多个字段排序 2.3 按子串排序 2.4 TRANSLATE 2.5 按数字和字母混合字符串中的字母排序 2.6 处理排序

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一3.2 基于代价的查询转换

3.2 基于代价的查询转换 在进行基于代价的查询转换时,转换器先确认查询是否满足转换条件.一旦满足,就会对各种可行的转换方式进行枚举,并对它们进行代价估算,找到代价最低的方式.由此可见,相对于启发式查询转换,基于代价的查询转换是一个相当消耗资源(CPU和内存)的过程.提示:Oracle中有一个优化器参数_OPTIMIZER_COST_BASED_TRANSFORMATION,用它来控制是否进行基于代价的查询转换,以及如何进行基于代价的查询转换,从而限制其对资源的消耗. 3.2.1 复杂视图合并

《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式

原文:<SQL Server企业级平台管理实践>读书笔记--关于SQL Server数据库的备份方式 数据备份一直被认为数据库的生命,也就是一个DBA所要掌握的主要技能之一,本篇就是介绍SQL Server备份原则,SQL Server数据库分为数据文件和日志文件.为了使得数据库能够恢复一致点,备份不仅需要拷贝数据数据文件里的内容,还要拷贝日志文件里的内容.那么根据每次备份的目标不同,我们可以将备份分为数据备份和日志备份. 数据备份的范围可以是完整的数据库.部分数据库.一组文件或文件组.所以根