基于ORACLE数据库的SQL性能优化
龙源期刊网
基于ORACLE数据库的SQL性能优化
作者:岳彩云 赖晓风
来源:《电脑知识与技术》2020年第10期
龙源期刊网
龙源期刊网
龙源期刊网
龙源期刊网
摘要:数据库系统是任何信息系统最重要的组成部分,它涉及信息系统运行效率,影响系统性能。随着现代信息技术的进步,数据库的规模越来越庞大,对数据处理的操作也越来越复杂。在Oracle数据库系统中,查询操作是最基本、最复杂、最频繁的操作,SQL的查询语句的效率直接影响数据库的整体性能。该文主要介绍了SOL的语句所用优化技术,简要分析了数据库逻辑结构的优化、数据库物理存储结构的优化、使用分区。同时深入研究SOL性能分析及优化,其中,手动进行SOLprofile绑定主要涉及要执行的SOL文本、计划出问题后的表现、采用sql lprofile绑定;索引调优涉及要执行的SOL文本、SQL执行的相关统计信息、SQL执行计划、创建索引等。经过研究得出,若想将ORACLE数据库性能提高,必须多角度优化SQL语句。 龙源期刊网
关键词:数据库;SQL;索引;查询
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2020)10-0017-03
1数据库结构优化
1.1数据库逻辑结构的优化
逻辑数据库设计不合理往往易产生数据冗余、更新异常、插入异常、删除异常等问题,所以逻辑数据库设计至少应满足规范化BC范式或第三范式。
为降低数据冗余、减少用于存储数据的页,可遵循高级别的范式来减少每张表的列数,但这将产生更多表,且表间关系会更复杂,这样会降低系统的性能,特别是查询性能。从某种意义上说,非规范化能提高系统效率,非规范化过程可以结合性能考虑用多种手段实现,所以进行数据库逻辑结构设计时应综合考虑数据冗余和基于连接的查询性能问题。
1.2数据库物理存储结构的优化
因为數据文件和日志文件的位置、分布直接影响到数据库系统性能,所以数据库设计应遵循:一是将序列访问的文件和数据文件分别存放在不同磁盘上,一般,序列访问文件宜存储于高速专用磁盘上,数据文件分散存储到不同的磁盘上而实现并行I/O,从而提高访问速度;二是数据类型应尽量使用所需的最小存储空间,特别是索引列,如能使用Smallint类型的就不用Int型,这样数据页就能存放更多的数据行,以减少I/O操作。
1.3使用分区
对于数据量超过PB级、TB级甚至更大的大型数据库,某些单表的记录数往往多达亿条,巨大的数据量将严重影响数据库的运行效率和运维难度。为解决这一问题,可对表进行合理分区。把大表分为多个更小、更容易管理的部分,充分利用数据库系统中的多个CPU或多个磁盘子系统,以改善数据库系统的运行效率。可以按照业务数据本身性质进行表分区,也可按时间进行表分区,或其他业务的维度进行分区。
2SQL性能分析及优化
不同的业务场景、数据库类型、数据逻辑结构及不同的网络、服务器等硬件环境,实验结果或有微小差异。以下所有实验结果都是针对某市某业务信息系统后台数据库进行的实验,且所用数据库为Oracle 12C版本,相关SQL处理后的效果只是一个大致的结果。 龙源期刊网
2.1手动进行SQL profile绑定
当Oracle面对执行计划失效或跑偏时,执行效率就会大大降低,影响数据库的查询性能甚至整个数据库性能,此时,最好的优化手段就是进行SQL profile人工绑定。例如:
2.1.1要执行的SQL文本
2.1.2计划出问题后的表现sql单次执行时间需要消耗204秒,单次运行产生逻辑读消耗995k块次,物理读323块次,按照标准块8k计算,需要消耗逻辑读7.9G,物理读2.5G。
系统消耗主要表现在ID=6,ac82_110共约6.4亿行数据,idex_ac82 110_7的distinct值为509。
2.1.3采用sql profile绑定
绑定后,SQL执行时间由207秒缩短至4秒,执行效率提高约50倍;物理读消耗由324k减少至4k,物理读消耗减少约80倍;逻辑读消耗由1M块次减少至108k,逻辑读减少约10倍。
2.2索引调优
能否有效使用索引是数据库是否取得高性能的关键。因为查询主要性能开销是磁盘I/O,而全表扫描会产生大量的磁盘I/O,而使用索引直接指向数据存放位置,则只需少量的磁盘读取操作,避免了全表扫描带来的性能开销,从而加速数据的查询过程。但是,索引也会使数据库在执行增、删、改等操作时增加额外的系统开销,并且索引本身也会占用数据库的空间。因此,索引并不是越多越好,只有建立合理有效的索引才有助于改善数据库性能。合理有效的索引是建立在对各种业务场景熟悉,科学的查询分析和预测基础上的。
2.2.1要执行的SQL文本
2.2.2 SQL执行的相关统计信息
平均逻辑读达87k块次,采样期为两天,两天执行18799次,属高执行频次,致使总逻辑读达1.6G块次。
2.2.3 SQL执行计划
2.2.4创建索引 龙源期刊网
从上述执行计划可看到,执行计划中存在索引跳跃扫描,而该索引得前导列yaz040的基数达15万多,这样的跳跃扫描很消耗性能,所以建议在AAZ288列上单独创建索引。创建索引语句如下:
2.2.5 SQL创建后的效果
通过创建索引后,执行时间只有0.01s,平均逻辑读只有几百块次甚至更低。
2.3 SQL语句本身优化
在数据库系统中,使用SQL不能仅仅关注执行结果的正确性,更应关注在不同的软、硬件及网络环境和业务场景下存在的性能差异,这种性能差异在大型甚至超大型数据库环境中尤为明显。本人在工作和学习的实践中发现,性能低下的SQL往往来自滥用索引、连接的误用和无法优化的where子句。通过避免以上问题,可以明显提高SQL运行效率。
2.3.1要执行的SQL文本
2.3.2 SQL执行的相关统计信息
SQL在统计单次执行时间约40分钟,单次逻辑读8.9M块次,按标准块8k计算,需要消耗约70G的逻辑读。
2.3.3执行计划
注意到id=8,10,7,id=8通过id=9即KB05K1的自链接条件返回了851条结果集,然后作为驱动表同id=10做了一个filter,这意味着要对KB05K1做约800次的扫描。性能消耗就出在这里。
2.3.4 SQL语句优化调整
2.3.5 SQL语句优化后的执行效果
将源语句标亮部分造成的多次大表扫描,用分析函数替代,可只走一次扫描。逻辑读由原来的8900k块次变为137k块次,缩小65倍。查询由原来的40分钟变为3秒。
3结束语
文章对Oracle数据库性能调整和优化进行了简要的分析和研究,对数据库设计、SQL的性能等的优化进行了探讨。但在实际工作中,针对不同的数据量级、不同的软件、硬件环境以及网络环境,需要综合考虑各种方法和制定多种措施。Oracle数据库性能优化是一项系统工龙源期刊网
程,需要对数据库系统的运行状态做出全面的评估并根据工作实际情况系统地动态调整数据库以得到最优的性能。
Oracle优化面试题
Oracle优化⾯试题
Oracle SQL性能优化
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM⼦句中的表名,FROM⼦句中写在最后的表(基础表 driving table)将被最先处理,在FROM⼦句中包含多个表
的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他
表所引⽤的表.
(2)WHERE⼦句中的连接顺序.:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在
WHERE⼦句的末尾.
(3)SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间
(4) 减少访问数据库的次数:ORACLE在内部执⾏了许多⼯作: 解析SQL语句, 估算索引的利⽤率, 绑定变量 , 读数据块等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200
(6) 使⽤DECODE函数来减少处理时间:
使⽤DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
(7) 整合简单,⽆关联的数据库访问:
如果你有⼏个简单的数据库查询语句,你可以把它们整合到⼀个查询中(即使它们之间没有关系)
(8) 删除重复记录:
最⾼效的删除重复记录⽅法 ( 因为使⽤了ROWID)例⼦:DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) ⽤TRUNCATE替代DELETE:
oracle 慢sql查询语句
oracle 慢sql查询语句
慢SQL查询是指执行时间较长的SQL查询语句,通常会对数据库性能产生负面影响。在Oracle数据库中,出现慢SQL查询的原因可能有很多,例如查询条件不合理、索引缺失、数据量过大等。下面列举了一些常见的慢SQL查询场景及相应的优化建议。
1. 慢SQL查询场景:未使用索引进行查询
优化建议:通过查看执行计划,确认是否存在索引缺失的情况。可以通过创建合适的索引来提高查询性能。
2. 慢SQL查询场景:使用了模糊查询
优化建议:模糊查询通常会导致全表扫描,影响查询性能。可以考虑使用全文索引或者优化查询条件,减少模糊匹配的范围。
3. 慢SQL查询场景:大表关联查询
优化建议:大表关联查询会导致临时表的产生以及大量的磁盘IO,影响查询性能。可以考虑使用分页查询或者优化查询逻辑,减少关联表的数量。
4. 慢SQL查询场景:使用了函数或表达式
优化建议:函数或表达式的使用会导致在查询执行过程中进行计算,影响查询性能。可以考虑将计算逻辑提前计算好,存储在数据库中,避免重复计算。
5. 慢SQL查询场景:大量数据的排序查询
优化建议:大量数据的排序查询可能会导致临时表的产生以及大量的磁盘IO,影响查询性能。可以通过创建排序索引或者优化查询条件,减少排序的数据量。
6. 慢SQL查询场景:查询结果集过大
优化建议:查询结果集过大会占用大量的内存资源,影响查询性能。可以通过分页查询或者优化查询条件,减少查询结果集的大小。
7. 慢SQL查询场景:频繁的表锁竞争
优化建议:频繁的表锁竞争会导致查询阻塞,影响查询性能。可以通过合理设计数据库表结构、调整事务隔离级别或者优化查询逻辑,减少表锁竞争的情况。
8. 慢SQL查询场景:存在死锁问题
优化建议:死锁问题会导致查询阻塞,影响查询性能。可以通过合理设计数据库表结构、调整事务隔离级别或者优化查询逻辑,避免死锁问题的发生。
hint语句
hint语句
hint语句是一种SQL查询语句,用于对Oracle数据库的性能优化。它通过提供一个“提示”来帮助Oracle引擎更好地改善查询性能,从而达到最佳查询性能。在执行SQL语句时,Oracle根据Hint 语句中提供的信息来选择执行计划。
Hint语句是一种特殊的SQL语句,它告诉Oracle如何处理指定的SQL语句以获得最佳性能。Hint语句可以帮助Oracle改善查询性能,但不能改变查询语句的内容或本质。也就是说,当Oracle执行Hint语句时,它将不会改变原始的查询语句。
Hint语句用来指导Oracle引擎如何处理给定的SQL语句,可以提高SQL查询的效率,减少查询时间。它可以提供一些信息,如使用什么方法来访问数据库、是否使用并行查询、是否使用索引等。
Hint语句可以帮助开发者调整查询性能,但必须慎重使用,因为错误的使用可能会降低性能或产生其他错误。Hint语句应该根据当前的性能需求,以及当前的系统环境,来进行选择。
Hint语句主要包括以下几种类型: 1. 功能性提示:这种提示用于指定Oracle如何处理查询。例如,可以使用parallel hint指示Oracle应用并行查询,或使用index hint指示Oracle使用特定的索引。
2. 统计信息提示:这种提示可以向Oracle提供表或索引的行数、分布等统计信息。这些信息可以帮助Oracle更好地估算查询的性能,以便更好地执行查询。
3. 优化器提示:这种提示可以指示Oracle使用特定的优化器来优化查询,从而提高查询性能。
4. 其他提示:这种提示可以指示Oracle执行特定的操作,比如指定扫描表的顺序,或者指定某个SQL语句的优先级等。
在Oracle中,Hint语句用于提高SQL查询的性能,但是必须慎重使用,否则可能会降低性能。正确的使用Hint语句可以显著提高查询性能,建议使用Hint语句时先进行测试,以确保Hint语句不会对性能产生负面影响。
Oracle SQL性能优化之探究
74 王关祥张焕远夏亚东刘瑾王华兵:Oracl。SQ[胜能优化之探究 技术在线
lO.3969/j.issn.1671—489X.2012.03.074
O r ac l e SOL性能优化之探究
王关祥 张焕远 夏亚东 刘瑾 王华兵
l山东农业大大学网络与教育技术部 山东泰安271017
2南京中兴软创公司南京研发中心南京210012
摘要在数据库应用中,根据用户提交的查询请求,如何才能精炼又高效地得到查询结果?从多个角度描述怎样
优化SQL语句。实验结果表明,SOL优化能够减轻系统资源的占用,满足用户的要求。
关键词SOL优化;RBO;CBO;SGA;高效SOL
中图分类号:TP311 文献标识码:B 文章编号:1671—489X(2012)03—0074—03 Research on Orac l e SOL Performance Opt i m i zat i on//Wang Guanxiang ,Zhang Huanyuan ,Xia Yadong ,Liu
jin ,Wang Huabing
Abstract In the database application,how to refining and effiCientlY get the query resu1t according to user’S query request?ThiS article describes how to optimize the SQL statement with
many aspects.The experimental results show that,SOL optimization that can reduce the occupier of
system resources, 1 o meet the requirements of the customers.
Key words SQL(11)t imization:RBO:CBO;SGA:efficient SQL Author’S address
关于SQL文优化问题总结
关于SQL文优化问题总结
【摘 要】实际系统中遇到性能问题是非常常见的,性能优化有许多方面,其中包括硬件方面,软件方面,包括服务器端,客户端等等。本文重点基于oracle分析了影响sql文性能的原因,然后列举了几点性能优化的对策,希望给开发人员在编码时提供帮助,给sql的性能问题调查者提供一个方向。
【关键词】oracle;性能问题;sql文优化
一、问题提出
之前有个项目,其中的批处理定期调用一个存储过程,在测试环境中运行没有问题,但是正式运行出现了错误,执行存储过程时出现了错误:提示是表空间不足。为了解决这个问题,笔者对sql文的性能优化进行了学习和研究。
二、问题调查与解决
由于该存储过程内容比较多,大概有3000多行,也不能判断那部分出了问题,首先在可能出现问题的地方追加了log信息。由于测试环境中该问题不能再现,所以代码更新到了实际环境中进行运行,通过log发现是在执行某个sql文时出的错误,这个sql文涉及到了10多个表,而其中表中的数据量比较大。执行时用到的临时表空间高达40g,后来通过调查对sql的进行了调整,只是修改了where条件中其中两个条件的顺序,这个问题就解决了。
三、sql文性能原因分析
(1)在大记录集上进行高成本操作,如使用了引起排序的谓词
等。(2)过多的i/o操作(含物理i/o与逻辑i/o),最典型的就是未建立恰当的索引,导致对查询表进行全表扫描。减少访问数据库的次数,就能实际上减少oracle的工作量。(3)处理了太多的无用记录,如在多表连接时过滤条件位置不当导致中间结果集包含了太多的无用记录。(4)未充分利用数据库提供的功能,如查询的并行化处理等。
四、sql文性能优化总结
(1)建立恰当的索引。对经常进行排序和连接操作的字段建立索引。(2)避免使用”*”,sql文中引用”*”,使用起来的确非常方便,但是效率非常低,主要是oracle在解析的过程中,会将”*”一次转化成所有的列名,这个工作是通过查询数据字典完成的。这就意味着消耗更多的时间。(3)尽量避免多表关联。(4)避免使用消耗资源的操作,带有distinct,union,minus,intersect,order
图书推荐——《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》
图书推荐——《Oracle⾼性能SQL引擎剖析:SQL优化与调优机
制详解》
《Oracle ⾼性能SQL 引擎剖析:SQL 优化与调优机制详解》
Oracle 数据库的性能优化直接关系到系统的运⾏效率,⽽影响数据库性能的⼀个重要因素就是
SQL 性能问题。本书是作者⼗年磨⼀剑的成果之⼀,深⼊分析与解剖Oracle SQL 优化与调优技术,主
要内容包括:
第⼀篇“执⾏计划”详细介绍各种执⾏计划的含义与操作,为后⾯的深⼊分析打下基础。重点讲
解执⾏计划在SQL 语句执⾏的⽣命周期中所处的位置和作⽤,SQL 引擎如何⽣成执⾏计划以及如何获
取SQL语句的执⾏计划,如何从各种数据源显⽰和查看已经⽣成的执⾏计划。
第⼆篇“SQL 优化技术”深⼊分析Oracle 的SQL 优化技术,包括逻辑优化技术和物理优化技术。
⽤⼤量⽰例详尽分析Oracle 中现有的各种查询转换技术,先分析Oracle 如何收集、统计系统和对象的
数据,然后推导各种代价估算公式,给出各种情形下的代价计算演⽰。
第三篇“SQL调优技术”深⼊剖析Oracle 提供的各项调优技术。先对语句实际运⾏的性能统计
数据进⾏了深度分析,介绍各项统计数据是由什么操作导致的以及如何统计。然后介绍如何对SQL 语
句进⾏优化以获得稳定、⾼效的性能。最后,依据对SQL 优化及调优技术的分析,介绍如何快速优化SQL 的思路。
本书内容丰富且深⼊,破解了Oracle 技术的很多秘密,适合Oracle数据库管理员、应⽤开发⼈员
参考。
基于OracleExadata的数据库整合及性能优化
基于OracleExadata的数据库整合及性能优化
摘要:Oracle Exadata将智能存储软件和标准化硬件相结合,提供了高性能及高稳定性的数据库存储服务。对其配置及有特色的功能进行了介绍,在使用及深入研究之后,通过对数据库整合及其参数配置性能优化的方式,提高了其整体运行效率。
关键词:Oracle Exadata;数据库整合;性能优化
0 引言
随着数据库系统规模的增加,传统的系统架构的瓶颈问题越来越突出。首先在存储层,随着长时间的运行会带来数据分布不均及IO瓶颈,其次在网络层由于带宽的不足会导致大量数据无法快速传达,最后在服务器层由于接收过多的数据处理,内存优势无法发挥。具体而言就是传统的存储设备不知道数据库驻留在存储设备上,因此无法提供任何数据库识别 I/O 或 SQL 处理。数据库请求行或列时,从存储返回的是数据块而非数据库查询的结果集。传统的存储不具备数据库智能来识别实际请求的特定行或列。因此,当数据库查询处理
I/O请求时,传统的存储将消耗带宽,返回大量与执行的数据库查询不相关的数据。
1 Oracle Exadata功能及特点
1.1 Oracle Exadata功能
Oracle Exadata其实是一台带有CPU、内存及操作系统(Oracle
Enterprise Linux)的服务器,当数据库需要查询时,Exadata可对数据进行筛选,然后将结果传送到服务器内存,而不是将结果转移到存储系统中,从而大量减少存储系统的读写。
Exadata是一个模块化产品,每一个模块称为存储单元,增加存储单元可以提高这个系统的吞吐量,并称为一种大容量并行的存储网格,增加存储单元可以增加传输管道的数量。Oracle Exadata智能存储服务器通过在存储部件中实现数据密集处理,并进行表及索引的扫描,与数据过滤无关,从而减轻服务器及带宽的负载,提高工作效率。
1.2 智能扫描
0racle数据库的优化探讨
0racle数据库的优化探讨
摘要:Oracle数据库作为全球第一大数据库厂商,在国内外获得了广泛应用,本文对Oracle数据库性能调整和优化进行了简要分析和研究,对各种优化技术进行了深入的探讨,将SQL语句优化、Oracle内存分配调整作为论文的主要研究内容。
关键词:数据库 优化
随着数据库规模的扩大,用户数量的增加,数据库应用系统的响应速度下降,性能问题越来越突出。数据库系统的性能调整与优化对于整个系统的正常运行起着至关重要的作用。基于此,本文主要研究SQI语句、Oracle内存分配的性能优化问题,给出了一般情况下Oracle数据库应用系统的性能优化方一法,以期推动Oracle数据库性能优化技术的发展。
1 SQL查询优化
数据库系统是管理信息系统的核心,从大多数系统的应用实例来看,查询操作在各种数据库操作中占据的比重最大,查询速度的快慢直接影响数据库的推广和应用,对于大型数据库来说,这一点显得尤其重要。由于查询操作在SQL语句中代价最大,因此优质的查询语句可以大大提高应用系统的性能。
1.1 查找有问题的SQL语句 ①利用SQL Trace工具分析SQL语句。
Oracle的SQL Trace工具是确定SQL语句是否被合理优化的最好方法之一。如果发现当前会话行为异常或性能下降,则可以通过该工具获得有关系统操作性能的信息,如解析、执行和返回数据的次数、CPU时间和执行时间、物理读和逻辑读操作次数、库缓冲区命中率等。一旦为会话激活了SQL-TRACE Oracl。就会在udump管理区创建跟踪文件。由于SQL Trace将这些信息以一种不可读的格式存放在跟踪文件中,因p一个字段的标签同时在主查询和where子句中的查询中出现,那么当主查询中的字段值改变之后,子查询必须重新查询一次。对于子查询来说,查询嵌套层次越多,效率越低,因此应当尽量避免它。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。在Oracle中相关子查询的执行效率特别低,引入临时表可以使其速度快100倍左右。
oracle sql优化面试题
oracle sql优化面试题
1. 介绍SQL优化的重要性(约200字)
在大规模数据处理和复杂查询的背景下,SQL优化在提高性能和效率方面起到至关重要的作用。通过优化SQL查询语句,我们可以减少数据库的负载,提升查询速度,提高系统的响应能力和用户体验。SQL优化能够帮助我们减少不必要的计算和IO操作,从而减少系统资源的消耗,提高系统的稳定性和可用性。因此,了解并掌握SQL优化技巧对于数据库开发和管理人员来说是非常重要的。
2. 查询优化相关的基本概念和知识(约400字)
2.1 索引的使用
索引是优化查询性能的重要手段之一。在表中创建适当的索引可以加快查询速度。需要注意的是,索引的创建需要根据具体的查询需求和数据特征进行选择。索引字段应该选择在查询中使用频率较高的列,并且避免过多的索引,以免增加维护成本。
2.2 SQL语句的编写与书写风格
合理的SQL语句编写和书写风格能够提高查询性能。应避免使用通配符查询,尽量使用具体的条件进行查询。同时,避免使用SQL中的函数,尽量使用简单的操作符,减少不必要的计算和转换操作。
2.3 数据库范式设计 合理的数据库范式设计可以减少冗余数据,提高数据查询的效率。通过将数据分解为多个关联的表,可以避免数据重复,从而减少在查询过程中对重复数据的计算和传输。
3. SQL优化常见问题和解决方案(约800字)
3.1 查询中的表连接优化
当查询需要多个表之间进行连接时,选择合适的连接类型是重要的。根据数据量和查询结果的大小,可以选择INNER JOIN、LEFT JOIN或者RIGHT JOIN等连接方式。另外,可以考虑对经常进行连接操作的字段添加索引,加快连接过程。
3.2 子查询的优化
子查询在某些情况下可以帮助我们实现复杂的查询逻辑,但是过多的子查询会增加系统的负载和查询时间。为了优化子查询,可以考虑将子查询转换为连接查询、使用临时表或者使用WITH语句。
Oracle优化器(Optimizer)
Oracle优化器(Optimizer)是Oracle在执行SQL之前分析语句的工具。
Oracle的优化器有两种优化方式:
基于规则的优化方式:Rule-Based Optimization(RBO)
优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
基于成本或者统计信息的优化方式(Cost-Based Optimization:CBO)
CBO是在ORACLE7 引入,但到ORACLE8i 中才成熟。ORACLE 已经声明在ORACLE9i之后的版本中,RBO将不再支持。它是看语句的代价(Cost),这里的代价主要指Cpu和内存。CPU Costing的计算方式现在默认为CPU+I/O两者之和.可通过DBMS_XPLAN.DISPLAY_CURSOR观察更为详细的执行计划。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。按理,CBO应该自动收集,实际却不然,有时候在CBO情况下,还必须定期对大表进行分析。
Oracle优化器的优化模式:
1) CHOOSE
仅在9i及之前版本中被支持,10g已经废除。8i及9i中为默认值。
这个值表示SQL语句既可以使用RBO优化器也可以使用CBO优化器,而决定该SQL到底使用哪个优化器的唯一因素是,所访问的对象是否存在统计信息。如果所访问的全部对象都存在统计信息,则使用CBO优化器优化SQL;如果只有部分对象存在统计信息,也仍然使用CBO优化器优化SQL,优化器会为不存在统计信息对象依据一些内在信息(如分配给该对象的数据块)来生成统计信息,只是这样生成的统计信息可能不准确,而导致产生不理想的执行计划;如果全部对象都无统计信息,则使用RBO来优化该SQL语句。
