oracle 执行计划 详解
oracle执行计划解读

oracle执行计划解读执行计划是Oracle数据库查询优化器生成的一个重要工具,用于指导数据库在执行查询语句时的执行路线和资源分配。
通过解读执行计划,我们可以深入了解查询语句的执行情况,进而优化查询性能。
以下是对Oracle执行计划的详细解读:1. 访问方法(Access Method):执行计划的第一步是选择合适的访问方法来获取所需的数据。
这取决于表的大小、索引的可用性和查询条件等。
常见的访问方法包括全表扫描(Full Table Scan)、索引扫描(Index Scan)和索引唯一扫描(Index Unique Scan)等。
2. 连接方式(Join Method):如果查询语句中包含连接操作(如JOIN),执行计划会根据连接条件选择合适的连接方式。
常见的连接方式有Nested Loops(嵌套循环连接)、Merge Sort(合并排序连接)和Hash Join(哈希连接)等。
优化器会根据表的大小和索引的可用性等因素选择最佳的连接方式。
3. 过滤条件(Filter):执行计划中的过滤条件显示了查询语句中使用的WHERE子句以及相关的索引和扫描操作。
过滤条件可以帮助我们判断查询是否使用了正确的索引和是否存在过多的全表扫描。
4. 排序方式(Sort):如果查询语句包含ORDER BY子句或GROUP BY子句,执行计划中会显示排序操作的方式。
排序方式分为内部排序(In-Memory Sort)和外部排序(Disk Sort)。
内部排序会将数据加载到内存中进行排序,适用于较小的数据集。
外部排序会将数据写入磁盘进行排序,适用于较大的数据集。
5. 访问路径(Access Path):执行计划中的访问路径显示了查询语句中使用的索引、分区和子查询等相关操作。
通过分析访问路径,我们可以判断查询语句是否使用了合适的索引和是否存在不必要的数据访问操作。
6. 成本估算(Cost Estimate):执行计划中的成本估算显示了优化器对执行每个操作所需的资源消耗的估计值。
oracle执行计划优化深入解读

oracle执行计划优化深入解读优化执行计划是Oracle数据库性能优化的重要步骤之一。
执行计划是Oracle查询优化器生成的一组指令,告诉数据库引擎如何执行查询语句。
通过深入解读和优化执行计划,可以显著提高查询性能。
首先,了解执行计划的基本原理是十分重要的。
执行计划是由优化器生成的,它是一种指导数据库引擎在执行查询语句时的操作顺序和方法的方式。
了解执行计划中的各种操作符(如全表扫描、索引扫描、连接操作等)以及它们的执行顺序对于优化执行计划至关重要。
在深入解读执行计划时,我们可以从几个方面入手。
首先,要关注执行计划中的成本估算。
优化器会根据统计信息、索引选择和查询语句的逻辑结构等因素,估算每个操作的成本,并选择成本最低的执行计划。
通过审查这些成本估算,我们可以找到性能瓶颈,并进行相应的优化。
其次,考虑适当的索引设计是优化执行计划的关键因素之一。
索引可以极大地提高查询性能。
通过创建正确的索引,我们可以帮助优化器选择最佳的执行计划。
例如,对于频繁进行查询的列,我们可以创建索引来加速查询的速度。
此外,我们还应该关注查询的统计信息。
统计信息是优化器做出决策的重要依据。
正确收集和维护统计信息对于优化执行计划至关重要。
定期收集统计信息并确保其准确性是优化执行计划的关键步骤之一。
最后,我们可以使用Oracle提供的工具来调整和优化执行计划。
例如,通过使用HINTS,我们可以直接指示优化器选择特定的执行计划。
此外,通过使用SQL Profile或SQL Plan Baseline,我们可以将已经优化过的执行计划应用于特定的查询语句。
在优化执行计划时,还需要注意一些常见问题。
例如,避免全表扫描、避免不必要的连接操作、合理设置索引等。
通过综合分析查询的逻辑结构和数据特征,我们可以识别出这些问题,并进行相应的优化。
综上所述,深入解读和优化执行计划是提高Oracle数据库查询性能的重要步骤。
通过了解执行计划的基本原理,审视成本估算、索引设计、统计信息和使用合适的工具,我们可以显著提高查询性能,并优化数据库的整体性能。
oracle执行计划解释

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)比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。
oracle执行计划怎么看

oracle执行计划怎么看【Oracle执行计划详解】Oracle执行计划是数据库查询优化的关键工具之一,它提供了查询语句的执行路径和各种操作的详细信息,可以帮助我们分析查询语句的性能问题和优化的可能方向。
本文将详细介绍如何查看Oracle执行计划,以及如何理解执行计划中的各种信息。
一、查看执行计划的方法在Oracle数据库中,我们可以通过以下几种方式来查看执行计划:1. 使用EXPLAIN PLAN语句EXPLAIN PLAN是Oracle内置的一个SQL语句,它能够分析给定的SQL语句,并将执行计划保存在数据库中。
具体用法如下:```EXPLAIN PLAN FOR your_sql_statement;```执行以上语句后,可以通过以下语句查看执行计划:```SELECT * FROM PLAN_TABLE;```2. 使用AUTOTRACE功能AUTOTRACE是Oracle提供的一个工具,它可以在执行SQL语句时同时输出执行计划和统计信息。
使用AUTOTRACE非常方便,只需执行以下语句:```SET AUTOTRACE ON;```然后执行目标SQL语句即可。
3. 使用SQL Developer如果你使用Oracle SQL Developer这样的工具,它会自动在查询结果面板中显示执行计划。
只需将光标悬停在查询语句上,即可查看详细的执行计划信息。
二、执行计划的解读无论通过哪种方式,查看的执行计划都是一张树状结构的表,它包含了查询语句中各个操作的执行顺序和执行方式。
以下是一些常见的执行计划信息解读:1. OPERATION该列显示了执行计划中的每个操作的名称,例如TABLE ACCESS FULL表示全表扫描,INDEX UNIQUE SCAN表示唯一索引扫描等。
2. OPTIONS该列显示了执行计划中的每个操作的附加选项,例如INDEX RANGE SCAN中的RANGE SCAN表示使用范围扫描。
Oracle优化之执行计划解析

Oracle优化之执行计划解析执行计划是Oracle数据库中一个非常重要的概念。
它是在执行SQL语句之前由Oracle优化器生成的一种指导性的路线图,用于指导数据库引擎执行查询和更新操作。
执行计划可以帮助我们理解SQL语句的执行过程,以及找出可能存在的性能瓶颈和优化机会。
执行计划是一个树状结构,其中每个节点表示一个SQL操作,如表扫描、索引扫描、排序、连接等。
每个节点都包含了一些关键信息,如访问方法、访问对象、访问行数等。
一般而言,执行计划中的节点都按照一定的顺序执行。
例如,首先进行表扫描,然后进行索引扫描,最后进行连接操作。
执行计划中的每个节点都有一个估计的成本,该成本与执行该操作所需的时间和资源有关。
优化器会根据这些成本来选择最佳的执行计划。
要解析执行计划,我们需要关注以下几个方面:1.访问方法:执行计划中的每个节点都有一个访问方法,用于告诉数据库引擎如何获取数据。
常见的访问方法包括表扫描、索引扫描、索引范围扫描、连接等。
通过分析访问方法,我们可以了解到数据库引擎是如何获取数据的,从而找出潜在的性能问题。
2.访问对象:执行计划中的每个节点都会访问一个或多个数据库对象,如表、索引等。
通过分析访问对象,我们可以了解到数据库引擎是如何获取和处理数据的,从而找出可能存在的性能瓶颈。
3.访问行数:执行计划中的每个节点都会访问一定数量的数据行。
通过分析访问行数,我们可以了解到数据库引擎是如何处理数据的,从而找出性能优化的机会。
4.执行顺序:执行计划中的节点是按照一定的顺序执行的。
通过分析执行顺序,我们可以了解到查询的执行过程,从而找出可能存在的性能问题。
在解析执行计划时,我们可以使用多种工具和技术。
常用的工具包括SQL*Plus的AUTOTRACE功能、Oracle SQL Developer的执行计划窗口等。
这些工具可以将执行计划以图形或文本的形式展示出来,方便我们进行分析和理解。
此外,我们还可以使用一些Oracle提供的视图和函数来获取和分析执行计划的信息。
ORACLE的执行计划

ORACLE的执行计划
一、Oracle执行计划
1.概念
Oracle执行计划是指Oracle数据库根据用户提交的SQL语句以及其执行需要的资源,使用一系列步骤来完成数据库操作的一个流程。
Oracle 根据执行计划来选择最优的执行步骤,从而把用户提交的任务在经济高效的方式完成。
Oracle会在执行时分析语句,收集有关语句的信息,构建一个执行计划,并选择一些优化操作去完成SQL的执行,从而达到最优的性能。
2.作用
Oracle的执行计划不仅可以帮助我们识别SQL语句的生成过程,也可以识别其它的执行步骤,如执行的索引使用情况、连接的表数量、执行步骤的顺序等。
通过分析执行计划,我们可以找到瓶颈,分析出SQL语句的性能瓶颈,并根据瓶颈可以有效的改进SQL的性能,从而提高系统的效率。
3.类型
Oracle的执行计划可以分为Cost Based和Rule Base两种。
Cost Based执行计划是Oracle的主要执行计划,它会对查询中使用的资源(索引、表空间、大小等)进行评估,并根据评估结果来选择执行步骤,从而得到一个当前SQL最优的执行计划。
而Rule Base执行计划会根据Oracle的规则去生成一个执行计划,不会根据优化的考虑。
4.工具
在查看Oracle执行计划之前,我们首先要拿到Oracle的查询优化器产生的执行计划,有两种办法可以查看Oracle的执行计划:(1)SQL*Plus的Explain Plan命令:我们可以使用Explain Plan 命令。
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性能优化之oracle中常见的执行计划及其简单解释

Oracle性能优化之oracle中常见的执⾏计划及其简单解释⼀、访问表执⾏计划1、table access full:全表扫描。
它会访问表中的每⼀条记录(读取⾼⽔位线以内的每⼀个数据块)。
2、table access by user rowid:输⼊源rowid来⾃于⽤户指定。
3、table access by index rowid:输⼊源rowid来⾃于索引。
4、table access by global index rowid:全局索引获取rowid,然后再回表。
5、table access by local index rowid:分区索引获取rowid,然后再回表。
6、table access cluster:通过索引簇的键来访问索表。
7、external table access:访问外部表。
8、result cache:结果集可能来⾃于缓存。
9、mat_view rewrite access:物化视图。
⼆、与B-TREE索引相关的执⾏计划1、index unique scan:只返回⼀条rowid的索引扫描,或者unique索引的等值扫描。
2、index range scan:返回多条rowid的索引扫描。
3、index full scan:顺序扫描整个索引。
4、index fast full scan:多块读⽅式扫描整个索引。
5、index skip scan:多应⽤于组合索引中,引导键值为空的情况下索引扫描。
6、and-equal:合并来⾃于⼀个或多个索引的结果集。
7、domain index:应⽤域索引。
三、与BIT-MAP索引相关的执⾏计划1、bitmap conversion:将位转换为rowid或相反。
2、bitmap index:从位图中取⼀个值或⼀个范围。
3、bitmap merge4、bitmap minus:5、bitmap or:四、与表连接相关的执⾏计划1、merge join:排序合并连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 这些运算符及其实施的顺序由优化器使用查询转换及 物理优化技术的组合来确定
• 执行计划通常以表格的形式显示,但它实际上为树形
什么是执行计划?
查询
SELECT prod_category, avg(amount_sold) FROM sales s, products p WHERE p.prod_id = s.prod_id GROUP BY prod_category;
SALES
-------------------------------------------
如何获取执行计划
示例 3 显示 V$SQL_PLAN 中的任何其他语句的执行计划
1.直接:
SQL> SELECT plan_table_output FROM
table(dbms_xplan.display_cursor('fnrtqw9c233tt',null,'basic'));
2.间接:
SQL> SELECT plan_table_output FROM v$sql s, TABLE(dbms_xplan.display_cursor(s.sql_id,s.child_number, 'basic')) t WHERE s.sql_text like 'select PROD_CATEGORY%';
复杂表达式,其中包含来自多个表 使用 4 级或更高的动态抽样级别 的列
*柱状图会对具有 11g 之前的绑定的语句产生令人注目的副作用 请谨慎使用
访问方法 — 获取数据
访问方法 完整表扫描 按 ROWID 访问表 索引唯一扫描 索引范围扫描 索引跳过扫描 完整索引扫描
快速完整索引扫描 索引联接 位图索引
• 目标是尽可能快地完成查询操作 • 优化器不关注执行计划所需的资源
理解执行计划
<在此处插入图片>
SQL 执行计划
您在查看计划时能否确定以下项是否正确?
• 基数
• 每个对象是否生成正确的行数?
• 访问方法
• 是否以最好的方式访问数据?扫描?索引查找?
• 联接顺序
• 是否以正确的顺序联接各表以便尽早尽多地消除数据?
1 HASH GROUP BY
2 HASH JOIN
3 TABLE ACCESS FULL PRODUCTS
4 PARTITION RANGE ALL
5 TABLE ACCESS FULL SALES
----------------------------------------------------------
0 SELECT STATEMENT
1 HASH GROUP BY
2 HASH JOIN
3 TABLE ACCESS FULL PRODUCTS
4 PARTITION RANGE ALL
5 TABLE ACCESS FULL
SALES
-------------------------------------------
1
<在此处插入图片>
Explain Plan 命令说明
Nancy Guo 郭颖忠 Senior Sales Consultant
免责声明
• 本讲座旨在为您提供有关如何阅读 SQL 执行计划的说 明,并帮助您确定该计划是否满足您的要求。
• 本讲座并不能使您一举成为优化器专家,也无法使您 具备轻松调整 SQL 语句的能力!
注:有关详情,请访问 www.optimizermagic.b DBMS_XPLAN 参数
• DBMS_XPLAN.DISPLAY 接受 3 个参数
• 计划表的名称(默认为“PLAN_TABLE”), • statement_id(默认为 null) • 格式(默认为“TYPICAL”)
SQL> SELECT plan_table_output
FROM table(dbms_xplan.display('plan_table',null,'basic'));
------------------------------------------
Id Operation
Name
------------------------------------------
如何获取执行计划
示例 2 生成并显示在会话中最后执行的 SQL 语句的执行计划
SQL>SELECT prod_category, avg(amount_sold) FROM sales s, products p WHERE p.prod_id = s.prod_id GROUP BY prod_category;
一个优秀的优化器计划 是什么样的?
<在此处插入图片>
一个优秀的优化器计划是什么样的?
优化器有两个不同的目标 • 串行执行:其关注的是开销
• 开销越低越好
• 并行执行:其关注的是性能
• 速度越快越好
两个基本问题: • 什么是开销? • 什么是性能?
什么是开销?
• 优化器生成的神奇数字? • 执行 SQL 语句所需的资源? • 复杂计算的结果? • 执行语句所需时间的估计? 实际定义 • 开销指的是所使用的工作单元或资源的数量
• 联接类型
• 是否使用了正确的联接类型?
• 分区修剪
• 我执行过分区修剪吗?是否消除了足够多的数据?
• 并行度
基数
什么是基数?
• 估算将返回的行数 • 单值谓词的基数 = 行的总数/不同值的总数
• 例如:共 100 行,共 10 个不同值 => 基数 = 10 行
• 或者,如果为柱状图表示,则是行数 * 密度
执行计划的树形表示
Group By HASH JOIN
TABLE ACCESS PRODUCTS
TABLE ACCESS SALES
如何获取执行计划
可以使用两种方法查看执行计划
1.EXPLAIN PLAN 命令
• 显示一条 SQL 语句的执行计划,而不实际执行此语句
2.V$SQL_PLAN
• 在 Oracle 9i 中引入的字典视图,它可显示已编译到游标缓存中一 个游标的一条 SQL 语句的执行计划
为什么要关注?
• 它将影响所有方面!访问方法、联接类型、联接顺序等
哪些因素会导致基数出错?
• 统计信息陈旧/缺少 • 数据偏差 • 一个表有多个单列谓词 • where 子句谓词中包含函数 • 复杂表达式,其中包含来自不同表的列
基数或选择度
估算返回行数的基数
使用简单的 SELECT COUNT(*) 从每个表应用任何属于该表的 WHERE 子句谓 词确定正确的基数
DBMS_STATS
数据偏差
创建一个柱状图*
一个表有多个单列谓词
使用 DBMS_STATS.CREATE_EXTENDED_STATS 创 建一个列组
在一个联接中使用多个列
使用 DBMS_STATS.CREATE_EXTENDED_STATS 创 建一个列组
包含函数的列
使用 DBMS_STATS.CREATE_EXTENDED_STATS 创 建有关包含函数的列的统计信息
Name
------------------------------------------
0 SELECT STATEMENT
1 HASH GROUP BY
2 HASH JOIN
3 TABLE ACCESS FULL PRODUCTS
4 PARTITION RANGE ALL
5 TABLE ACCESS FULL
议题
• 什么是执行计划,如何生成执行计划? • 一个优秀的优化器计划是什么样的? • 理解执行计划
• 基数 • 访问方法 • 联接顺序 • 联接类型 • 分区修剪 • 并行度
• 执行计划示例
什么是执行计划,如何生 成执行计划?
<在此处插入图片>
什么是执行计划?
• 执行计划显示在执行一条 SQL 语句时必须执行的详细 步骤
• DBMS_XPLAN.DISPLAY_CURSOR 接受 3 个参数
• SQL_ID(默认为此会话中最后一个执行的语句), • 子编号(默认为 0), • 格式(默认为“TYPICAL”)
• 格式是高度可定制的
• Basic • Typical • All • 其他低级别参数可显示更多的详细信息
使用 DBMS_XPLAN 包来显示执行计划
在某些情况下,使用 EXPLAIN PLAN 显示的计划可能与使用 V$SQL_PLAN 显示的计划不同
如何获取执行计划
示例 1 EXPLAIN PLAN 命令和 dbms_xplan.display 函数 SQL> EXPLAIN PLAN FOR
SELECT prod_category, avg(amount_sold) FROM sales s, products p WHERE p.prod_id = s.prod_id GROUP BY prod_category; Explained
访问相邻索引项,可返回多个 ROWID 值。与等式一起用于非唯一索引,或与范 围谓词一起用于唯一索引(<.>、between 等)
如果前导列中只有很少的不同值,而非前导列中有许多不同的值,则跳过索引的 前导部分,使用其余有用的部分
处理索引的所有叶块,但只有经过足够多的分支块才能找到第 1 个叶块。当所有 需要的列都位于索引中且 order by 子句与索引结构匹配,或者排序合并联接已完 成时,即可使用