oracle 执行计划PPT课件
- 格式:ppt
- 大小:368.50 KB
- 文档页数:16
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语句进行重写、创建索引、收集统计信息等方式,从而提高数据库的性能。
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执行计划Oracle执行计划是Oracle数据库用于优化和执行SQL语句的步骤和顺序的一个计划。
在执行SQL语句之前,Oracle会分析SQL语句并生成一个执行计划,然后根据执行计划来执行SQL语句。
执行计划可以帮助开发人员和数据库管理员了解SQL语句的执行过程,找出性能瓶颈,并进行优化调整。
执行计划由一系列步骤和操作符组成,每个操作符表示一个SQL语句执行的特定步骤或操作。
Oracle数据库使用一个优化器来生成执行计划,优化器会考虑多个因素,如表的大小、索引的选择、连接类型等,以选择最佳的执行计划。
执行计划中的操作符可以分为以下几类:1. 表扫描操作符(Table Scan Operator):表示从表中逐行读取数据。
这是最基本和最常见的操作符之一、它可以是全表扫描(Full Table Scan)或索引扫描(Index Scan)。
2. 连接操作符(Join Operator):表示连接两个或多个表的操作。
连接操作是查询复杂性的一个重要组成部分,通过选择最合适的连接类型,可以极大地提高查询的性能。
3. 过滤操作符(Filter Operator):表示对查询结果进行筛选,只返回符合特定条件的数据。
过滤操作可以利用索引或表达式进行优化。
4. 排序操作符(Sort Operator):表示对查询结果进行排序,以按特定的顺序返回数据。
排序操作可以使用内存排序(In-Memory Sort)或磁盘排序(Disk Sort)。
5. 分组操作符(Group By Operator):表示将查询结果按照指定的列进行分组。
分组操作常用于聚合查询,如求和、计数等。
6. 聚合操作符(Aggregation Operator):表示对分组后的数据进行聚合计算。
聚合操作包括求和、计数、平均值等。
7. 索引操作符(Index Operator):表示使用索引来加速查询。
索引操作包括索引扫描、索引唯一扫描等。