oracle执行计划学习文档
Oracle数据库中级培训(执行计划)第6讲

上海全成通信技术有限公司 金刚(seniordba@) 金刚 2009-12
目录
PLAN(执行计划 执行计划) 一. SQL EXECUTION PLAN(执行计划) 成本分析入门) 二. SQL COST(成本分析入门 成本分析入门 表分区)设计 三. PARTITION(表分区 设计 表分区 四. INDEX(索引 索引) 索引 并行) 五. PARALLEL(并行 并行 提示) 六. HINT(提示 提示 七. 设计开发误区
步骤一:人工设置 和存储子系统处理能力。 用户下执行) 步骤一:人工设置CPU和存储子系统处理能力。(在sys用户下执行 和存储子系统处理能力 在 用户下执行 begin dbms_stats.set_system_stats('MBRC',12); dbms_stats.set_system_stats('MREADTIM',30); dbms_stats.set_system_stats('SREADTIM',5); dbms_stats.set_system_stats('CPUSPEED',1500); end; /
案例1:关于 案例 关于CPU成本讨论 关于 成本讨论
步骤三: 步骤三:分析执行计划
1)explain plan for select /*+ cpu_costing ordered_predicates */ * from t1 where v1 = 1 and n2 = 18 and n1 = 998 ;
分析如下: 分析如下: 1)类型转换30000次,比较30000+1500+75=31574 2)类型转换1次, 比较30002 3)类型转换30000次,比较30000+1500+1=31501 4)类型转换1次, 比较30002 5)类型转换30000次,比较1502次 结论: 结论: 1.COST(CPU)= 10,456,833/(1500*5000)=1.39 2.优化技巧,避免数据类型转换 优化技巧, 优化技巧
oracle基础知识(十三)----执行计划

oracle基础知识(⼗三)----执⾏计划⼀, 执⾏计划是什么? ⼀条查询语句在ORACLE中的执⾏过程或访问路径的描述。
即就是对⼀个查询任务,做出⼀份怎样去完成任务的详细⽅案。
⼆,执⾏计划的查看 设置autotrace序号命令解释1SET AUTOTRACE OFF此为默认值,即关闭Autotrace2SET AUTOTRACE ON EXPLAIN只显⽰执⾏计划3SET AUTOTRACE ON STATISTICS只显⽰执⾏的统计信息4SET AUTOTRACE ON包含2,3两项内容5SET AUTOTRACE TRACEONLY与ON相似,但不显⽰语句的执⾏结果SQL>set autotrace on;SQL>select table_name from user_tables;....特别多...在最下⾯1003 rows selected.Execution Plan------------这就是执⾏计划----------------------------------------------------------Plan hash value: 3799402342---------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------|0|SELECT STATEMENT ||5893| 949K|605 (1)|00:00:08||*1| HASH JOIN RIGHT OUTER||5893| 949K|605 (1)|00:00:08||2|TABLE ACCESS FULL| SEG$ |5734|63074|47 (0)|00:00:01||*3| HASH JOIN RIGHT OUTER||2798| 420K|558 (1)|00:00:07||4|INDEX FULL SCAN | I_USER2 |86|344|1 (0)|00:00:01||*5| HASH JOIN||2798| 409K|557 (1)|00:00:07||6|TABLE ACCESS FULL| TS$ |5|15|3 (0)|00:00:01||*7| HASH JOIN OUTER||2798| 401K|554 (1)|00:00:07||*8| HASH JOIN OUTER||2798| 379K|486 (1)|00:00:06||9| NESTED LOOPS ||2798| 366K|418 (1)|00:00:06||10| MERGE JOIN CARTESIAN||3751| 380K|292 (1)|00:00:04||*11| HASH JOIN||1|68|0 (0)|00:00:01||*12| FIXED TABLE FULL| X$KSPPI |1|55|0 (0)|00:00:01||13| FIXED TABLE FULL| X$KSPPCV |100|1300|0 (0)|00:00:01||14| BUFFER SORT ||3751| 131K|292 (1)|00:00:04||*15|TABLE ACCESS FULL| OBJ$ |3751| 131K|292 (1)|00:00:04||*16|TABLE ACCESS CLUSTER| TAB$ |1|30|1 (0)|00:00:01||*17|INDEX UNIQUE SCAN | I_OBJ# |1||0 (0)|00:00:01||18|INDEX FAST FULL SCAN | I_OBJ1 |86281| 421K|68 (0)|00:00:01||19|INDEX FAST FULL SCAN | I_OBJ1 |86281| 674K|68 (0)|00:00:01|---------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1- access("T"."FILE#"="S"."FILE#"(+) AND "T"."BLOCK#"="S"."BLOCK#"(+) AND"T"."TS#"="S"."TS#"(+))3- access("CX"."OWNER#"="CU"."USER#"(+))5- access("T"."TS#"="TS"."TS#")7- access("T"."DATAOBJ#"="CX"."OBJ#"(+))8- access("T"."BOBJ#"="CO"."OBJ#"(+))11- access("KSPPI"."INDX"="KSPPCV"."INDX")12- filter("KSPPI"."KSPPINM"='_dml_monitoring_enabled')15- filter("O"."OWNER#"=USERENV('SCHEMAID') AND BITAND("O"."FLAGS",128)=0) 16- filter(BITAND("T"."PROPERTY",1)=0)17- access("O"."OBJ#"="T"."OBJ#")Statistics-----这⾥是统计信息----------------------------------------------------------8 recursive calls0 db block gets8809 consistent gets0 physical reads0 redo size31347 bytes sent via SQL*Net to client1250 bytes received via SQL*Net from client68 SQL*Net roundtrips to/from client1 sorts (memory)0 sorts (disk)1003 rows processed 使⽤sql查看SQL>set autotrace off;SQL> explain plan for select*from WRI$_DBU_FEATURE_METADATA;Explained.SQL>SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE')); PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------Plan hash value: 563503327-----------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-----------------------------------------------------------------------------------------------PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------|0|SELECT STATEMENT ||176|91344|5(0)|00:00:01||1|TABLE ACCESS FULL| WRI$_DBU_FEATURE_METADATA |176|91344|5(0)|00:00:01|-----------------------------------------------------------------------------------------------8 rows selected.SQL>select*from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------Plan hash value: 563503327-----------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-----------------------------------------------------------------------------------------------PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------|0|SELECT STATEMENT ||176|91344|5(0)|00:00:01||1|TABLE ACCESS FULL| WRI$_DBU_FEATURE_METADATA |176|91344|5(0)|00:00:01|-----------------------------------------------------------------------------------------------8 rows selected.SQL> 客户端的话界⾯有解释选项⾃⼰找找三,执⾏计划解释 01.执⾏顺序的原则 执⾏顺序的原则是:由上⾄下,从右向左 由上⾄下:在执⾏计划中⼀般含有多个节点,相同级别(或并列)的节点,靠上的优先执⾏,靠下的后执⾏ 从右向左:在某个节点下还存在多个⼦节点,先从最靠右的⼦节点开始执⾏。
oracle学习计划3篇

oracle学习计划3篇oracle学习计划一:swufe oracle club bi学习计划一、学习内容:〔一〕工具〔老成员〕:1、 oracle bi:娴熟运用该工具:重点学习报表设计;权限管理;bi publisher。
2、 e*cel:娴熟适用常用的统计、分析函数能够高效地提升项目进度。
3、pl/sql:侧重学习数据在该工具与数据库、bi工具间信息流的相关知识。
4、oracle database:娴熟查询历史数据,擅长发觉重点信息,能够开发依据项目需求和后端报表展示的数据存储模型。
5、etl〔odi,informatic,sql语言〕:实现依据项目需求对杂乱的历史数据进行整理、分析、加载。
6、数据模型:依据项目需求,以及后端展示工具设计数据模型。
工具〔新成员〕:1、oracle bi:通过step by step娴熟操作oracle bi基本工具。
2、e*cel:学习常用的统计、分析函数。
3、pl/sql〔后期〕4、oracle database〔后期〕〔二〕软实力:1、管理:管理是我们学习的核心,始于自己、究竟他人。
本学期采纳项目管理由老成员一对一〔多〕方式带领潜在核心成员。
2、英语:基础技能,特别是外企。
3、写作:基础技能,会议记录是提高写作技能很好方式,项目文档亦是如此〔每个项目都会形成大量的项目文档。
项目文档能够清楚、全面的反映该项目,同时也是解决项目的基本内容之一〕。
4、沟通:基础技能,团队内部;客户沟通。
一切的需求和产出都需要通过沟通实现。
5、分析:基础技能,规律分析有利于理解客户需求,充分挖掘数据潜在价值,推动项目高效地完成。
6、统计学:发觉数据规律、联系,展示其潜在价值。
二、工作内容:〔一〕日常维护:306作为我们的学习基地,每个成员有责任和义务使之维持一个舒适的学习环境。
〔二〕个人总结:定期总结是对自己和组织负责。
〔三〕成员沟通:团队的沟通是重要的社交形式,也是人生存的基本技能与需要。
oracle执行计划学习文档

oracle执行计划学习文档一、O racl e 执行SQL的步骤1.1、SQL 语句的两种类型DDL语句,不共享,每次执行硬解析;DML语句,会共享,硬解析或者软解析。
1.2、SQL执行步骤1、语法检测。
判断一条SQL语句的语法是否符合SQL的规范;2、语义检查。
语法正确的SQL语句在解析的第二个步骤就是判断该SQL语句所访问的表及列是否准确?用户是否有权限访问或更改相应的表或列?3、检查共享池中是否有相同的语句存在。
假如执行的SQL语句已经在共享池中存在同样的副本,那么该SQL语句将会被软解析,也就是可以重用已解析过的语句的执行计划和优化方案,可以忽略语句解析过程中最耗费资源的步骤,这也是我们为什么一直强调避免硬解析的原因。
这个步骤又可以分为两个步骤:(1)验证SQL语句是否完全一致。
(2)验证SQL语句执行环境是否相同。
比如同样一条SQL语句,一个查询会话加了/*+ first_rows */的HINT,另外一个用户加/*+ all_rows */的HINT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。
通过如上三个步骤检查以后,如果SQL语句是一致的,那么就会重用原有SQL语句的执行计划和优化方案,也就是我们通常所说的软解析。
如果SQL语句没有找到同样的副本,那么就需要进行硬解析了。
4、Oracle根据提交的SQL语句再查询相应的数据对象是否有统计信息。
如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个)和相应的Cost,最终选择Cost最低的那个执行计划。
如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。
这个步骤也是解析中最耗费资源的,因此我们应该极力避免硬解析的产生。
至此,解析的步骤已经全部完成,Oracle将会根据解析产生的执行计划执行SQL语句和提取相应的数据。
二、优化器介绍Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。
Oracle执行计划

基本使用方式:SQL> set autotrace on; (SQL PLUS中使用)
3.其他工具
PPT文档演模板
Oracle执行计划
准备:创建Plan_table表
PPT文档演模板
create table plan_table ( statement_id
long,
Oracle执行计划
PPT文档演模板
AUTO TRACE
SQL> set autotrace on; SQL> select * from dual; D X Execution Plan ----------------------------------------------------------
cost
integer,
cardinality
integer,
bytes
integer,
other_tag
varchar2 (255),
partition_start varchar2 (255),
partition_stop varchar2 (255),
partition_id
integer,
other
connect by prior id=parent_id ;
Oracle执行计划
第一个执行 计划
对应SQL语句:
select * from dual;
执行计划:
PPT文档演模板
Oracle执行计划
怎样看执行计划
执行计划其实是一棵树,层次最深的最先执行,层次 相同,上面的先执行。显示时已经按照层次缩进,因 此从最里面的看起。最后一组就是驱动表。例:
oracle的执行计划

oracle的执行计划Oracle是一种关系型数据库管理系统,执行计划是指在Oracle数据库中执行SQL语句的方式和过程。
它是由Oracle优化器生成的一种“蓝图”,它描述了通过何种方式来执行SQL以获得所需结果集。
这个“蓝图”包含有关要使用哪种访问方法,如何组合表和索引以及如何过滤结果集的信息,执行计划的准确性和有效性是影响SQL执行效率的主要因素之一。
一、Oracle执行计划的基本原理Oracle在执行SQL的时候,会自动根据查询条件和表结构等因素生成一份执行计划。
在执行计划的生成过程中,Oracle会根据不同的查询方法和算法,通过消耗最少的时间来获取查询结果。
因此,对于复杂的SQL查询,可能会有多个执行计划可供选择,而不同的执行计划会对查询效率产生显著的影响。
在考虑生成执行计划的方法和算法时,Oracle优化器一般会考虑以下几个因素:1. 索引的选择:如果有可用的索引可以用于查询,优化器就会选择使用索引。
2. 连接方式:Oracle查询可以使用多种连接方式,如NL join, Hash join和Sort merge join等,优化器会尝试选择最适合当前查询的连接方式。
3. 筛选条件的处理:Oracle会尝试使用所有可用的筛选条件来限制查询结果,以便从数据表中检索出尽可能少的行。
4. 查询方式:Oracle可以使用多种查询方式来获得所需结果,如扫描整个表或仅使用部分表,或使用合并或排序等操作来产生所需结果。
在执行计划的生成过程中,优化器通过对表统计信息的分析和对SQL语句分析,可以获得优化方案的估计成本,并选择代价最小的执行计划来执行查询。
二、Oracle执行计划的格式在Oracle中,可以使用EXPLAIN PLAN语句来查看SQL执行计划。
执行计划的输出结果通常包括以下几个部分:1. ID: 执行计划中每个操作的唯一标识符,可以作为连接其他操作的依据。
2. Operation: 执行计划中每个操作的名称。
oracle学习计划3篇

oracle学习计划3篇oracle学习打算一:swufe oracle club bi学习打算一、学习内容:(一)工具(老成员):1、oracle bi:熟练使用该工具:重点学习报表设计;权限治理;bi publisher。
2、e_cel:熟练适用常用的统计、分析函数能够高效地提升项目进度。
3、pl/sql:侧重学习数据在该工具与数据库、bi工具间信息流的相关知识。
4、oracle database:熟练查询历史数据,善于发觉重点信息,能够开发依照项目需求和后端报表展示的数据存储模型。
5、etl(odi,informatic,sql语言):实现依照项目需求对杂乱的历史数据进行整理、分析、加载。
6、数据模型:依照项目需求,以及后端展示工具设计数据模型。
工具(新成员):1、oracle bi:通过step by step熟练操作oracle bi差不多工具。
2、e_cel:学习常用的统计、分析函数。
3、pl/sql(后期)4、oracle database(后期)(二)软实力:1、治理:治理是我们学习的核心,始于自己、终于他人。
本学期采纳项目治理由老成员一对一(多)方式带领潜在核心成员。
2、英语:基础能力,专门是外企。
3、写作:基础能力,会议记录是提高写作能力非常好方式,项目文档亦是如此(每个项目都会形成大量的项目文档。
项目文档能够清晰、全面的反映该项目,同时也是解决项目的差不多内容之一)。
4、沟通:基础能力,团队内部;客户沟通。
一切的需求和产出都需要通过沟通实现。
5、分析:基础能力,逻辑分析有利于理解客户需求,充分挖掘数据潜在价值,推动项目高效地完成。
6、统计学:发觉数据规律、联系,展示其潜在价值。
二、工作内容:(一)日常维护:306作为我们的学习基地,每个成员有责任和义务使之维持一个舒适的学习环境。
(二)个人总结:定期总结是对自己和组织负责。
(三)成员交流:团队的交流是重要的社交形式,也是人一辈子存的差不多能力与需要。
ORACLE中的执行计划

Oracle 执行计划1,什么是执行计划所谓执行计划,顾名思义,就是对一个查询任务,做出一份怎样去完成任务的详细方案。
举个生活中的例子,我从珠海要去英国,我可以选择先去香港然后转机,也可以先去北京转机,或者去广州也可以。
但是到底怎样去英国划算,也就是我的费用最少,这是一件值得考究的事情。
同样对于查询而言,我们提交的SQL仅仅是描述出了我们的目的地是英国,但至于怎么去,通常我们的SQL中是没有给出提示信息的,是由数据库来决定的。
我们先简单的看一个执行计划的对比:SQL> set autotrace traceonly执行计划一:SQL> select count(*) from t;COUNT(*)----------24815Execution Plan0 SELECT STATEMENT Optimizer=CHOOSE1 0 SORT (AGGREGATE)2 1 TABLE Access (FULL) OF 'T'执行计划二:SQL> select count(*) from t;COUNT(*)24815Execution Plan0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)1 0 SORT (AGGREGATE)2 1 INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE) (Cost=26 C ard=28180)这两个执行计划中,第一个表示求和是通过进行全表扫描来做的,把整个表中数据读入内存来逐条累加;第二个表示根据表中索引,把整个索引读进内存来逐条累加,而不用去读表中的数据。
但是这两种方式到底哪种快呢?通常来说可能二比一快,但也不是绝对的。
这是一个很简单的例子演示执行计划的差异。
对于复杂的SQL(表连接、嵌套子查询等),执行计划可能几十种甚至上百种,但是到底那种最好呢?我们事前并不知道,数据库本身也不知道,但是数据库会根据一定的规则或者统计信息(statistics)去选择一个执行计划,通常来说选择的是比较优的,但也有选择失误的时候,这就是这次讨论的价值所在。
Oracle的执行计划详解

Oracle的执行计划详解(2009-09-22 16:28:37)转载标签: oracle执行计划it 分类:oracle一、什么是执行计划An explain plan is a representation of the access path that is taken when a query is executed within Oracle.二、如何访问数据At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:Full Table Scan (FTS) --全表扫描Index Lookup (unique & non-unique) --索引扫描(唯一和非唯一)Rowid --物理行id三、执行计划层次关系When looking at a plan, the rightmost (ie most inndented) uppermost operation is the first thing that is executed. --采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行1.看一个简单的例子:Query Plan-----------------------------------------SELECT STATEMENT [CHOOSE] Cost=1234**TABLE ACCESS FULL LARGE [:Q65001] [ANALYZED] --[:Q65001]表示是并行方式,[ANALYZED]表示该对象已经分析过了优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采用CBO还是RBO:SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采用CBOSELECT STATEMENT [CHOOSE] Cost= --Cost为空,采用RBO2.层次的父子关系,看比较复杂的例子:PARENT1**FIRST CHILD****FIRST GRANDCHILD**SECOND CHILDHere the same principles apply, the FIRST GRANDCHILD is the initial operation then the FIRST CHILD followed by the SECOND CHILD and finally the PARENT collates the output.四、例子解说Execution Plan----------------------------------------------------------0 **SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)1 0 **HASH JOIN (Cost=3 Card=8 Bytes=248)2 1 ****TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=3 Bytes=36)3 1 ****TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=16 Bytes=304)左侧的两排数据,前面的是序列号ID,后面的是对应的PID(父ID)。
oracle执行计划

oracle执行计划Oracle执行计划。
Oracle执行计划是数据库系统中非常重要的一个概念,它指的是Oracle数据库在执行SQL语句时所选择的最优执行路径。
通过执行计划,我们可以了解到Oracle是如何执行SQL语句的,从而可以对SQL语句进行优化,提高数据库的性能。
在本文中,我们将深入探讨Oracle执行计划的相关内容,包括执行计划的基本概念、执行计划的生成方式、执行计划的解读和优化等方面。
首先,我们来了解一下执行计划的基本概念。
执行计划是Oracle数据库优化器根据SQL语句和数据库对象的统计信息,通过优化算法生成的一种执行路径。
这个执行路径包括了SQL语句的执行顺序、访问方法、连接方式等信息。
通过执行计划,我们可以知道数据库是如何执行SQL语句的,从而可以对SQL语句进行优化,提高数据库的性能。
接下来,我们将介绍执行计划是如何生成的。
在Oracle数据库中,执行计划是由优化器根据SQL语句和数据库对象的统计信息生成的。
优化器会根据SQL语句的复杂度、表的大小、索引的选择等因素,选择最优的执行路径。
在生成执行计划时,优化器会考虑多种执行路径,并选择成本最低的执行路径作为最终的执行计划。
然后,我们将讨论如何解读执行计划。
执行计划通常以树状结构的方式呈现,包括了SQL语句的执行顺序、访问方法、连接方式等信息。
我们可以通过执行计划了解到SQL语句的执行路径,从而可以对SQL语句进行优化。
例如,我们可以通过执行计划了解到是否使用了索引、是否进行了全表扫描等信息,从而可以对SQL语句进行优化,提高数据库的性能。
最后,我们将介绍如何优化执行计划。
通过执行计划,我们可以了解到SQL语句的执行路径,从而可以对SQL语句进行优化。
例如,我们可以通过执行计划了解到是否使用了索引、是否进行了全表扫描等信息,从而可以对SQL语句进行优化,提高数据库的性能。
在优化执行计划时,我们可以考虑对SQL语句进行重写、创建索引、收集统计信息等方式,从而提高数据库的性能。
(仅供参考)oracle执行计划详解

1<在此处插入图片>Explain Plan 命令说明Nancy Guo 郭颖忠Senior Sales Consultant免责声明•SQL 执行计划的说本讲座旨在为您提供有关如何阅读SQL明,并帮助您确定该计划是否满足您的要求。
•本讲座并不能使您一举成为优化器专家,也无法使您SQL具备轻松调整SQL 语句的能力!议题•什么是执行计划,如何生成执行计划?什么是执行计划如何生成执行计划?•一个优秀的优化器计划是什么样的?•理解执行计划•基数•访问方法•联接顺序•联接类型•分区修剪•并行度•执行计划示例<在此处插入图片>什么是执行计划,如何生成执行计划?•执行计划显示在执行一条SQL 语句时必须执行的详细执行计划显示在执行条SQL步骤•这些步骤表示为一组数据库运算符,这些运算符将使这些步骤表示为组数据库运算符这些运算符将使用和生成行•这些运算符及其实施的顺序由优化器使用查询转换及物理优化技术的组合来确定•执行计划通常以表格的形式显示,但它实际上为树形查询SELECT prod category avg(amount sold)SELECT prod_category, avg(amount_sold)FROM sales s, products pWHERE p.prod_id = s.prod_idGROUP BY prod_category;G B 执行计划的表格表示-----------------------------------------------------------Id Operation Name 执行计划的树形表示Group By HASH JOIN Id Operation Name-----------------------------------------------------------0 SELECT STATEMENT1 HASH GROUP BY2HASH JOIN TABLE ACCESS TABLE ACCESS2 HASH JOIN3 TABLE ACCESS FULL PRODUCTS4 PARTITION RANGE ALL5 TABLE ACCESS FULL SALESSALESPRODUCTS ----------------------------------------------------------可以使用两种方法查看执行计划1.EXPLAIN PLAN 命令1EXPLAIN PLAN•显示一条SQL 语句的执行计划,而不实际执行此语句2.V$SQL_PLAN2V$SQL PLAN•在Oracle 9i 中引入的字典视图,它可显示已编译到游标缓存中一个游标的一条SQL 语句的执行计划使用DBMS_XPLAN 包来显示执行计划在某些情况下,使用EXPLAIN PLAN 显示的计划可能与使用V$SQL_PLAN 显示的计划不同V$SQL PLAN示例1 EXPLAIN PLAN 命令和dbms_xplan.display 函数SQL> EXPLAIN PLAN FORSELECT prod_category, avg(amount_sold)FROM sales s, products pp p_p_WHERE p.prod_id = s.prod_idGROUP BY prod_category;ExplainedSQL> SELECT plan_table_outputSQL>SELECT plan table outputFROM table(dbms_xplan.display('plan_table',null,'basic'));------------------------------------------Id Operation NameId O ti N------------------------------------------0 SELECT STATEMENT1 HASH GROUP BY2 HASH JOIN3 TABLE ACCESS FULLPRODUCTS4 PARTITION RANGE ALL5 TABLE ACCESS FULL SALES-------------------------------------------示例2 生成并显示在会话中最后执行的SQL 语句的执行计划SQL>SELECT prod_category, avg(amount_sold)FROM sales s, products pFROM l d tWHERE p.prod_id = s.prod_idGROUP BY prod_category;no rows selectedno rows selectedSQL> SELECT plan_table_outputFROM table(dbms_xplan.display_cursor(null,null,'basic'));------------------------------------------Id Operation Name------------------------------------------0 SELECT STATEMENT0SELECT STATEMENT1 HASH GROUP BY2 HASH JOIN3 TABLE ACCESS FULLPRODUCTS4 PARTITION RANGE ALL4PARTITION RANGE ALL5 TABLE ACCESS FULL SALES-------------------------------------------如何获取执行计划示例3 显示V$SQL_PLAN 中的任何其他语句的执行计划3V$SQL PLAN11.直接:SQL> SELECT plan_table_output FROMtable(dbms_xplan.display_cursor('fnrtqw9c233tt',null,'basic'));2.间接:SQL> SELECT plan_table_outputFROM$l TABLE(db l di l(l id hild b FROM v$sql s, TABLE(dbms_xplan.display_cursor(s.sql_id,s.child_number, 'basic')) tWHERE s.sql_text like 'select PROD_CATEGORY%';注:有关详情,请访问DBMS_XPLAN 参数•DBMS_XPLAN.DISPLAY 接受3 个参数DBMS XPLAN DISPLAY3•计划表的名称(默认为“PLAN_TABLE”),•statement_id(默认为null)•格式(默认为“TYPICAL”)•DBMS_XPLAN.DISPLAY_CURSOR 接受3 个参数•SQL_ID(默认为此会话中最后一个执行的语句),SQL ID(默认为此会话中最后个执行的语句)•子编号(默认为0),•格式(默认为“TYPICAL”)•格式是高度可定制的•Basic•Typical•All•其他低级别参数可显示更多的详细信息<在此处插入图片>个优秀的优化器计划一个优秀的优化器计划是什么样的?一个优秀的优化器计划是什么样的?优化器有两个不同的目标•串行执行:其关注的是开销•开销越低越好•并行执行:其关注的是性能•速度越快越好两个基本问题:•什么是开销?什么是性能•什么是性能?什么是开销?•优化器生成的神奇数字?•执行SQL 语句所需的资源?句所需的资•复杂计算的结果?•执行语句所需时间的估计?实际定义•开销指的是所使用的工作单元或资源的数量•优化器用CPU、内存使用和IO 作为工作单元内存使用和IO•开销是对执行操作时要使用的CPU 和内存量以及磁盘I/O 数的估计开销是Oracle 的一个内部量度性能是什么?•完成尽可能多的查询?•使用最少的资源获得尽可能快的运行速度?•获得最佳的并发率?实际定义•性能指的是对查询的最快响应时间•目标是尽可能快地完成查询操作•优化器不关注执行计划所需的资源<在此处插入图片>理解执行计划SQL 执行计划您在查看计划时能否确定以下项是否正确?•基数•每个对象是否生成正确的行数?•访问方法•是否以最好的方式访问数据?扫描?索引查找?•联接顺序•是否以正确的顺序联接各表以便尽早尽多地消除数据?•联接类型•是否使用了正确的联接类型?•分区修剪•我执行过分区修剪吗?是否消除了足够多的数据?•并行度基数什么是基数?•估算将返回的行数•单值谓词的基数= 行的总数/不同值的总数•例如:共100 行,共10 个不同值=> 基数= 10 行或者,如果为柱状图表示,则是行数密度•*为什么要关注?•它将影响所有方面!访问方法、联接类型、联接顺序等哪些因素会导致基数出错?统计信息陈•统计信息陈旧/缺少•数据偏差•个表有多个单列谓词一个表有多个单列谓词•where 子句谓词中包含函数•复杂表达式,其中包含来自不同表的列基数或选择度估算返回行数的基数使用简单的SELECT COUNT(*) 从每个表应用任何属于该表的WHERE 子句谓词确定正确的基数使用以下代码查看基数SELECT /*+ gather_plan_statistics */p.prod_name as product, sum(s.quantity_sold) as units, FROM sales s products pFROM sales s, products pWHERE s.prod_id =p.prod_idGROUP BY p.prod_name;SELECT * FROM table (DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST'));比较计划中每个操作的估算返回行数与实际返回行数使用SQL 监视器查看基数利用SQL 监视器,您可以比较计划中每个操作的SQL监视器您可以比较计划中每个操作的估算返回行数与实际返回行数有关解决基数问题的建议原因解决方法统计信息陈旧/缺少DBMS_STATS数据偏创建个柱状图数据偏差创建一个柱状图*一个表有多个单列谓词使用DBMS_STATS.CREATE_EXTENDED_STATS创建一个列组在一个联接中使用多个列使用___创DBMS STATS.CREATE EXTENDED STATS建一个列组包含函数的列使用DBMS_STATS.CREATE_EXTENDED_STATS创DBMS STATS CREATE EXTENDED STATS建有关包含函数的列的统计信息复杂表达式,其中包含来自多个表使用4 级或更高的动态抽样级别的列*柱状图会对具有11g 之前的绑定的语句产生令人注目的副作用请谨慎使用访问方法—获取数据访问方法解释完整表扫描读取表中所有行并过滤掉那些不符合WHERE 子句谓词的行。
ORACLE执行计划和SQL调优

提高查询性能
02
降低系统资源消耗
03
提高系统稳定性
优化后的SQL语句可以更快地返 回查询结果,减少用户等待时间。
通过减少不必要的磁盘I/O和 CPU使用,优化SQL语句可以减 轻数据库服务器的负担。
优化策略
根据瓶颈分析结果,采取相应的优化策略,如添加索引、调整查询条 件、使用分区等。
测试与验证
在实施优化后,通过实际测试验证优化效果,确保性能提升满足预期。
04 SQL调优技术
优化查询语句
减少全表扫描
使用`EXPLAIN PLAN`命令分析查询语句,检查是否进行了全表扫描,并尝试优化查询条件或使用索引来减少扫描范 围。
案例二:调整数据库参数提高性能
01
优化方法
02
调整SGA(系统全局区)大小,以适应系统内存需 求。
03
调整数据库缓存参数,提高缓存命中率。
案例二:调整数据库参数提高性能
调整数据库连接池参数,减少连接建立和断开的时间。
调整数据库日志参数,减少日志写入对系统性能的影响。
案例三:使用索引和分区优化查询性能
反规范化数据库设计
在某些情况下,为了提高查询性能,可以适当地反规范化数 据库设计。
05 SQL调优案例分析
案例一:优化复杂查询语句
总结词
优化复杂查询语句
详细描述
对于复杂的查询语句,可以通过优化查询条件、使用合适的索引和调整查询排序等方式来提高查询性 能。
案例一:优化复杂查询语句
创建合适的索引,提高查 询速度。
总结词
使用索引和分区优化查询性能
Oracle里的执行计划

Oracle⾥的执⾏计划第⼆章:Oracle⾥的执⾏计划2.1 什么是执⾏计划Oracle⽤来执⾏⽬标SQL语句的这些步骤的组合就被称为执⾏计划。
执⾏计划可以分为如下三个部分:1、⽬标SQL的正⽂、SQL ID和其执⾏计划所对应的的PLAN HASH VALUE。
2、执⾏计划的主体部分。
可以看到Oracle在执⾏⽬标SQL时所⽤的内部执⾏步骤,这些步骤的执⾏顺序,所对应的的谓词信息、列信息,优化器评估出来执⾏这些步骤后返回结果集的Cardinality、成本等内容。
执⾏计划⾏前*字符指执⾏步骤有对应的驱动或者过滤查询条件,这个星号对应的具体的驱动或过滤查询条件可以从执⾏计划的“Predicate Information(identified y operation id)”中找到。
实际上,这部分内饿哦那个就是上述执⾏步骤所对应的谓词信息。
access表⽰驱动查询条件。
3、执⾏计划的额外补充信息。
是否使⽤动态采样(dynamic sampling)是否使⽤Cardinality Feedback(Oracle 11g中引⼊的修正执⾏计划中返回结果集的Cardinality的⼀种技术⼿段)是否使⽤SQL Profile(Oracle 10g中引⼊的调整、稳定执⾏计划的⼀种⽅法)。
2.2 如何查看执⾏计划(1)、explain plan命令按F5,PL/SQL Developer就调⽤explain plan命令,F5只是explain plan命令上的⼀层封装⽽已。
语法:explain plan for + ⽬标SQLselect * from table(dbms_xplan.display)执⾏explain plan命令,则Oracle就将解析⽬标SQL所产⽣的执⾏计划的具体执⾏步骤写⼊PLAN_TABLE$,随后执⾏的select * from table(dbms_xplan.display)只是从PLAN_TABLE$中将这些具体执⾏步骤以格式化的⽅式显⽰出来。
Oracle数据库中级培训(执行计划)第7讲PPT课件

补充:GROUP BY 分组基数 Card(group by c1,c2,…,cn)= NDV(c1) ХNDV(c2) Х…ХNDV(cn)
2(n-1)
5
连接基数计算示例
连接选择率和基数计算示例:
select a.city_name,a.city_id,e_count
|
|
| 1 | NESTED LOOPS
|
| 1 | 49 | 3 (0)| 00:00:01 |
|
|
| 2 | PARTITION RANGE SINGLE |
| 1 | 39 | 2 (0)| 00:00:01 | 574 | 574 |
|* 3 | TABLE ACCESS FULL
| FCT_USE_DAY | 1 | 39 | 2 (0)| 00:00:01 | 574 | 574 |
嵌套循环连接 (要点)
嵌套循环连接的相关知识点:
1)嵌套循环连接可以用两幅典型的图来表示。 作为解释嵌套循环连接机制的工具,每副 图有各自的优点和不足。
2)嵌套循环通常用于从驱动表中过滤得到少 数行中的每一行用于连接第二个表以便从 从选取“少数行”。
10
嵌套循环连接(机制一)
该图简单的将一个表中的行与另一个表中的行连接起来, 用箭头表示活动的方向,这种表示使我们很容易看出一个表 中的行与另一个表中对应行之间的联系。
from fct_use_day b where b.dms_time_id=20101001 group by dms_area_id,DMS_SERVICE_TYPE_ID,DMS_ENTRANCE_ID;
ORACLE执行计划入门

ORACLE执行计划入门背景知识:为了更好的进行下面的内容我们必须了解一些概念性的术语:共享sql语句为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中。
这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。
因此,当你执行一个SQL 语句(有时被称为一个游标)时,如果该语句和之前的执行过的某一语句完全相同,并且之前执行的该语句与其执行计划仍然在内存中存在,则ORACLE就不需要再进行分析,直接得到该语句的执行路径。
ORACLE的这个功能大大地提高了SQL的执行性能并大大节省了内存的使用。
使用这个功能的关键是将执行过的语句尽可能放到内存中,所以这要求有大的共享池(通过设置shared buffer pool 参数值)和尽可能的使用绑定变量的方法执行SQL语句。
当你向ORACLE 提交一个SQL语句,ORACLE会首先在共享内存中查找是否有相同的语句。
这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。
下面是判断SQL语句是否与共享内存中某一SQL相同的步骤:1). 对所发出语句的文本串进行hashed。
如果hash值与已在共享池中SQL 语句的hash值相同,则进行第2步:2) 将所发出语句的文本串(包括大小写、空白和注释)与在第1步中识别的所有已存在的SQL语句相比较。
例如:SELECT * FROM emp WHERE empno = 1000;和下列每一个都不同SELECT * from emp WHERE empno = 1000;SELECT * FROM EMP WHERE empno = 1000;SELECT * FROM emp WHERE empno = 2000;在上面的语句中列值都是直接SQL语句中的,今后我们将这类sql成为硬编码SQL或字面值SQL使用绑定变量的SQL语句中必须使用相同的名字的绑定变量(bind variables) ,例如:a. 该2个sql语句被认为相同select pin , name from people where pin = :blk1.pin;select pin , name from people where pin = :blk1.pin;b. 该2个sql语句被认为不相同select pin , name from people where pin = :blk1.ot_ind;select pin , name from people where pin = :blk1.ov_ind;今后我们将上面的这类语句称为绑定变量SQL。
oracle执行计划阅读

oracle执行计划阅读英文回答:Understanding Oracle Execution Plans.An Oracle execution plan is a detailed representationof the steps that the Oracle database will take to executea SQL statement. It provides valuable information about how the database will retrieve and process data, and can beused to identify potential performance bottlenecks and optimize queries.The execution plan is generated by the Oracle optimizer, which takes into account the structure of the tables involved, the indexes available, and the statisticscollected by the database. The optimizer chooses the plan that is expected to execute the statement with the best possible performance.An execution plan can be viewed using the EXPLAIN PLANstatement. This statement will display the plan in a graphical or textual format, showing the operations that will be performed and the estimated cost of each operation.The following is an example of an execution plan for a simple SELECT statement:EXPLAIN PLAN FOR.SELECT.FROM customers.WHERE customer_id = 10;Plan:--------------------------------------------------------------------------------------------------------------------。
oracle学习计划

oracle学习计划篇一:oracle 学习计划10天学习Oracle计划XX年05月02日星期五 11:56Oracle10G十天学习计划共计10天(每天按6小时计算)三、预期目标:1. 安装 Oracle Database 10g 并配置数据库2. 管理 Oracle 例程3. 管理数据库存储结构4. 创建和管理用户帐户5. 执行备份和恢复数据库6. 监控数据库、解决使用数据库时出现的问题和维护数据库7. 配置 Oracle Net services8. 在数据库和文件之间移动数据9. 使用 RMAN 创建和管理备份集和映像副本10. 将数据库恢复到过去某一时刻的状态11. 使用 Oracle 安全备份来备份和恢复数据库12. 使用 Oracle 闪回技术恢复数据库13. 检测块损坏情况并采取相应的措施修复损坏的块14. 使用各种数据库 Advisor 来监控和提高数据库的性能15. 使用资源管理器来控制数据库资源的使用情况16. 使用调度程序来简化管理任务17. 复查数据库日志文件以便进行诊断18. 为数据库和单独的会话自定义基于语言的行为19. 管理 VLDB;实施安全数据库四、培训指导思想:以Oracle公司的官方培训教材为基础,结合客户的实际需求,适当增加客户感兴趣的内容,删除一些理论性强而客户又很少用到的内容。
五、具体授课安排:时间授课内容主要实验第一天内容一:简介(数据库体系结构)1. 描述课程目标2. 研究 Oracle 10g 数据库体系结构内容二:安装 Oracle 数据库软件1. 解释 DBA 核心任务和工具2. 计划 Oracle 安装3. 使用最佳的灵活的体系结构4. 使用 Oracle Universal Installer (OUI) 安装软件内容三:创建 Oracle 数据库1. 使用数据库配置助手 (DBCA) 创建数据库2. 使用 DBCA 创建数据库设计模板3. 使用 DBCA 生成数据库创建脚本内容四:管理 Oracle 例程1. 启动和停止 Oracle 数据库及组件2. 使用 Oracle Enterprise Manager (EM)3. 使用 SQL*Plus 和 iSQL*Plus 访问数据库4. 修改数据库初始化参数5. 了解数据库启动阶段6. 查看预警日志7. 使用数据字典实验一:安装数据库软件实验二:使用图形化界面实验三:创建数据库实验四:启动、关闭数据库实验五:设置参数文件实验六:查看预警日志第二天内容一:管理数据库存储结构1. 描述表数据存储(以块为单位)2. 定义表空间和数据文件的用途3. 了解和使用 Oracle Managed Files (OMF)4. 创建和管理表空间5. 获取表空间信息6. 描述自动存储管理 (ASM) 的主要概念和功能内容二:管理用户安全性1. 创建和管理数据库用户帐户2. 对用户进行验证3. 分配默认的存储区(表空间)4. 授予权限和撤消权限5. 创建和管理职责6. 创建和管理配置文件7. 实施标准口令保护功能8. 控制用户对资源的使用内容三:管理方案对象1. 定义方案对象和数据类型2. 创建和修改表3. 定义约束条件4. 查看表的列和内容5. 创建索引、视图和序号6. 解释临时表的用途7. 使用数据字典实验一:创建表空间实验二:使用OMF实验三:创建用户实验四:使用配置文件实验五:分配权限实验六:创建表实验七:创建索引实验八:创建约束等对象第三天内容一:管理数据和并发处理能力1. 通过 SQL 管理数据2. 确定和管理 PL/SQL 对象3. 描述触发器和触发事件4. 监控和解决锁冲突内容二:管理撤消数据1. 解释 DML 和撤消数据生成2. 监控和管理撤消3. 描述撤消数据和重做数据之间的区别4. 配置撤消保留5. 保障撤消保留6. 使用撤消 Advisor内容三:实施 Oracle 数据库安全性1. 描述 DBA 安全性责任2. 应用最少权限原则3. 启用标准数据库跟踪4. 指定跟踪选项5. 复查跟踪信息6. 维护跟踪线索实验一:学习SQL语句实验二:监控锁实验三:配置撤销段实验四:设置跟踪第四天内容一:配置 Oracle Network 环境1. 使用Oracle Enterprise Manager 配置Oracle Network 环境2. 创建其它监听程序3. 创建 Oracle Net Service 别名4. 配置连接时故障转移5. 控制 Oracle Net Listener6. 测试 Oracle Net 的连接性7. 确定何时使用共享服务器和专用服务器内容二:积极维护1. 使用统计数据2. 管理自动工作量资料档案库 (AWR)3. 使用自动数据库诊断监控程序 (ADDM)4. 描述指导框架5. 设置预警阈值6. 使用服务器生成的预警7. 使用自动任务内容三:性能管理1. 使用 Oracle Enterprise Manager 页监控性能2. 使用 SQL Tuning Advisor3. 使用 SQL Access Advisor4. 使用共享内存的自动管理5. 使用内存 Advisor 设置内存缓冲区的大小6. 使用与性能相关的动态视图7. 排除无效或不可用的对象中的故障实验一:配置Listener实验二:使用AWR实验三:使用ADDM实验四:设置预警实验五:使用工具调优第五天内容一:备份和恢复的概念1. 确定 Oracle 数据库中可能出现的错误类型2. 描述优化例程恢复的方法3. 确定检查点、重做日志文件和归档日志文件的重要性4. 配置 ARCHIVELOG 模式内容二:执行数据库备份1. 创建一致的数据库备份2. 在不关闭数据库的情况下进行备份3. 创建增量备份4. 自动数据库备份5. 监控快速恢复区内容三:执行数据库恢复1. 恢复丢失的控制文件2. 恢复丢失的重做日志文件3. 在数据文件丢失后执行完全恢复内容四:执行FlashBack1. 描述闪回数据库2. 使用闪回表将表内容还原到过去的某一特定时间点3. 恢复已删除的表4. 使用闪回查询查看截至任意时间点的数据库内容5. 使用闪回版本查询查看一段时间内的行版本6. 使用闪回事务处理查询查看行的事务处理历史记录内容五:移动数据1. 描述移动数据的可用方法2. 创建和使用目录对象3. 使用 SQL*Loader 从 Oracle 数据库(或用户文件)中装入数据4. 解释数据泵的通用体系结构5. 使用数据泵的导出和导入功能在 Oracle 数据库之间移动数据6. 使用外部表并通过平台独立文件移动数据实验一:备份数据库实验二:监控快速恢复区实验三:恢复试验实验四:flashback试验实验五:装载数据试验第六天内容一:配置 Recovery Manager1. Recovery Manager 的功能及其组件2. 使用 RMAN 的快速恢复区3. 配置 RMAN4. 控制文件自动备份5. 保留策略和通道分配6. - 在默认的NOCATALOG 模式下使用Recovery Manager 与目标数据库连接7. 显示当前的 RMAN 配置设置8. 更改数据库的备份保留策略内容二:使用 Recovery Manager1. RMAN 命令概览2. 并行备份集3. 压缩备份4. 映像副本5. 数据库整体备份和增量备份6. LIST 命令和 REPORT 命令7. 为数据库启用 ARCHIVELOG 模式8. 使用 Recovery Manager内容三:Oracle 安全备份1. 安装和配置2. 实施 Oracle 建议的策略3. RMAN 和 Oracle 安全备份4. 备份/恢复到磁带的数据库和文件系统文件5. 使用 obtool 和 Web 界面配置 Oracle 安全备份设备 (CLI/GUI)6. 为 Oracle 安全备份配置 EM 并对到磁带的备份进行测试 (EM)7. 使用 RMAN 将数据库备份到磁带 (CLI)8. 使用 OB Web 工具备份文件系统文件内容四:从非关键性数据丢失中恢复1. 非关键性文件恢复2. 创建新的临时表空间3. 重新创建重做日志文件、索引表空间和索引4. 只读表空间恢复5. 数据库管理员的验证方法6. 口令验证文件丢失7. 创建新的临时表空间8. 更改数据库的默认临时表空间实验一:配置Rman 试验实验二:使用Rman备份、恢复数据库实验三:重新创建重做日志文件实验四:重新创建索引表空间实验五:恢复口令文件第七天内容一:不完全恢复1. 恢复步骤2. 服务器管理的恢复和用户管理的恢复命令3. 恢复控制文件自动备份4. 创建新的控制文件5. 不完全恢复概览6. 不完全恢复最佳方案7. 利用重置日志简化恢复篇二:ORACLE学习计划篇一:oracle 学习计划10天学习oracle计划XX年05月02日星期五 11:56oracle10g十天学习计划共计10天(每天按6小时计算)1. database 10g 并配置数据库3. 储结构4. 户帐户5. 复数据库6. 决使用数据库时出现的问题和维护数据库7. net services8. 件之间移动数据9. 建和管理备份集和映像副本10. 到过去某一时刻的状态11. 安全备份来备份和恢复数据库12. 闪回技术恢复数据库13. 况并采取相应的措施修复损坏的块14. 库 advisor 来监控和提高数据库的性能15. 器来控制数据库资源的使用情况16. 来简化管理任务17. 志文件以便进行诊断18. 独的会话自定义基于语言的行为三、预期目标:安装 oracle 管理数据库存创建和管理用执行备份和恢监控数据库、解配置 oracle 在数据库和文使用 rman 创将数据库恢复使用 oracle 使用 oracle 检测块损坏情使用各种数据使用资源管理使用调度程序复查数据库日为数据库和单施安全数据库四、培训指导思想:以oracle公司的官方培训教材为基础,结合客户的实际需求,适当增加客户感兴趣的内容,删除一些理论性强而客户又很少用到的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle执行计划学习文档一、O racl e 执行SQL的步骤1.1、SQL 语句的两种类型DDL语句,不共享,每次执行硬解析;DML语句,会共享,硬解析或者软解析。
1.2、SQL执行步骤1、语法检测。
判断一条SQL语句的语法是否符合SQL的规范;2、语义检查。
语法正确的SQL语句在解析的第二个步骤就是判断该SQL语句所访问的表及列是否准确?用户是否有权限访问或更改相应的表或列?3、检查共享池中是否有相同的语句存在。
假如执行的SQL语句已经在共享池中存在同样的副本,那么该SQL语句将会被软解析,也就是可以重用已解析过的语句的执行计划和优化方案,可以忽略语句解析过程中最耗费资源的步骤,这也是我们为什么一直强调避免硬解析的原因。
这个步骤又可以分为两个步骤:(1)验证SQL语句是否完全一致。
(2)验证SQL语句执行环境是否相同。
比如同样一条SQL语句,一个查询会话加了/*+ first_rows */的HINT,另外一个用户加/*+ all_rows */的HINT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。
通过如上三个步骤检查以后,如果SQL语句是一致的,那么就会重用原有SQL语句的执行计划和优化方案,也就是我们通常所说的软解析。
如果SQL语句没有找到同样的副本,那么就需要进行硬解析了。
4、Oracle根据提交的SQL语句再查询相应的数据对象是否有统计信息。
如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个)和相应的Cost,最终选择Cost最低的那个执行计划。
如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。
这个步骤也是解析中最耗费资源的,因此我们应该极力避免硬解析的产生。
至此,解析的步骤已经全部完成,Oracle将会根据解析产生的执行计划执行SQL语句和提取相应的数据。
二、优化器介绍Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。
分析语句的执行计划的工作是由优化器(Optimizer)来完成的。
不同的情况,一条SQL 可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。
Oracle目前提供RBO和CBO两种优化器。
2.1 RBO(RULE-BASE Optimization)基于规则的优化器RBO的执行路径和等级:1、Single Row by Rowid(等级最高)2、Single Row by Cluster Join3、Single Row by Hash Cluster Key with Unique or Primary Key4、Single Row by Unique or Primary Key5、Clustered Join6、Hash Cluster Key7、Indexed Cluster Key8、Composite Index9、Single-Column Indexes10、Bounded Range Search on Indexed Columns11、Unbounded Range Search on Indexed Columns12、Sort Merge Join13、MAX or MIN of Indexed Column14、ORDER BY on Indexed Column15、Full Table Scan(等级最低)优化器根据上述等级优先选择高效的执行路径,以上涉及到的概念在后面详细分析。
2.2 CBO(COST-BASE Optimization)基于代价的优化器Oracle把一个代价引擎集成在数据库内核,用来估计每个执行计划的代价,并量化执行计划所耗费资源,从而选择选择最优的执行计划,查询耗费资源分为以下三种。
I/0代价,即从磁盘读数据到内存的代价,从数据文件中数据块的内容读取到SGA数据高速缓存中,这是数据访问最主要的代价,故优化原则一般以降低查询产生的I/0次数为主;CPU代价,即处理在内存中数据所需代价,如对数据进行排序(sort)或者连接(join)操作等;NetWork代价,对访问跨服务器数据库的数据,需要花费的传输操作耗费的资源。
CBO 方式通过表和索引的统计数据计算出相对准确的代价,然后采用最佳的执行计划,所以定期对表和索引进行分析是非常必要的,否则得不偿失,关于数据分析技术详见第三章。
2.3 优化器模式Optimization-mode 即优化器模式,可选值包括:1、Rule ,采用的是RBO;2、CHOOSE,根据实际情况,如果数据字典中包含了引用表的统计数据,则采用CBO优化器,否则采用RBO;3、ALL-Rows是CBO使用的第一种优化方法,以数据吞吐量为目标,以便可以使用最少的资源完成查询;4、FIRST-ROWS是CBO使用的第二种优化方法,以数据的响应时间为目标,以便快速查询出开始的几行;5、FIRST-ROWS_[1|10|100|1000] 是CBO使用的第三种优化方法,选择一个响应时间最小的计划,迅速查询出结果。
2.4 查看执行计划2.4.1、查看能执行计划方式1、通过下面的sql查询:explain plan forSELECT * FROM bss_org WHERE bss_org_id=1;SELECT * FROM table(dbms_xplan.display);2、直接看pl/sql的explain Plan。
2.4.2 Estimator共 3 种度量标准:1、Selectivity表示有多少 rows 可以通过谓词被选择出来,大小介于 0.0~1.0,0 表示没有 row 被选择出来。
如果没有 statistics,estimator 会使用一个默认的 selectivity 值,这个值根据谓词的不同而异。
比如 '=' 的 selectivity 小于 '<'。
如果有statistics,比如对于last_name = 'Smith',estimator 使用last_name 列的 distinct 值的倒数(注:是指表中所有 last_name 的 distinct 值),作为 selectivity。
如果 last_name 列上有 histogram,则使用 histogram 根据 last_name 值的分布情况产生的 selectivity 作为 selectivity。
Histogram 在当列有数据倾斜时可以大大帮助 CBO 产生好的 selectivity。
2. Cardinality表示一个 row set 的行数。
Base cardinality:base table 的行数。
如果表分析过了,则直接使用分析的统计信息。
如果没有,则使用表 extents 的数量来估计。
Effective cardinality:有效行集,指从基表中选择出来的行数。
是 Base cardinality 和表上所有谓词的组合 Selectivity 的乘积。
如果表上没有谓词,那么 Effective cardinality = Base cardinality。
Join cardinality:两表 join 后产生的行数。
是两表 cardinality 的乘积(Cartesian)乘以 Join 谓词的 selectivity。
Distinct cardinality:列上 distinct 值的行数。
Group cardinality:GROUP BY 操作之后 row set 的行数。
由 grouping columns 的distinct cardinality 和整个 row set 的行数决定。
group cardinality lies between max ( dist. card. colx , dist. card. coly ) and min ( (dist. card. colx * dist. card. coly) , num rows in row set )3. CostCost 表现了 Disk I/O, CPU usage, Memory usage 资源单位的使用数量(units of work or resource used)。
Access path 决定从 base table 获得数据所需的 units of work 的数量。
也就是说Access path 决定 Cost 的值。
Access path 可以是 table scan, fast full index scan, index scan。
Oracle10G中,优化器默认为CBO,OPTIMIZER_MODE默认值为ALL_ROWS。
不再使用古老的RBO模式,但RULE、CHOOSE并没有彻底消失,有些时候仍然可以作为我们调试的工具。
另DBMS_XPLAN.DISPLAY_CURSOR观察更为详细的执行计划。
2.5 Scan方式2.5.1、Full T able Scan 全表扫描优点:可以同时读多个数据块,减少了i/0访问次数,而且每个数据块只会被读一次。
在查询一个表>5%~10%的时候,或者想用并行查询时,可以考虑使用。
全表扫描的Hint: Full T able Scan Hints: /*+ FULL(table alias) */;2.5.2、Rowid Scans获得一行数据的最快方法。
一般要先通过index scan 获得Rowid,如果需要的列不在index 中,再进行Rowid Scans 获得相应的行,如果在index 中,则不需要Rowid Scans。
HINT(很少用到):/*+ ROWID ( table ) */2.5.3、Index Scans1)、Index Unique Scans最多返回一个rowid,用于Unique Index 且index cols 在条件中使用"等于"。
如:SELECT * from serv where serv_id='518108574'。
2)、Index Range Scans返回的数据按照index columns 升序排列,index column 为同一个值的多行按照行rowid 的升序排列。
如果order by/group by 的顺序和Index Range Scans 返回的row set 的顺序相同就不需要再sort 了,否则还需要再对row set 进行sort。
如: SELECT * from serv where prop_cust_id='518108574'.Unique index 中的< > 条件,以及nonunique indexe 的< = > 条件,都会引起Index Range Scans。