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 统计信息执行计划摘要:1.Oracle 统计信息的概念和作用2.Oracle 执行计划的概念和作用3.Oracle 统计信息和执行计划的关系4.如何查看和分析Oracle 执行计划5.如何利用Oracle 统计信息优化执行计划6.总结正文:Oracle 统计信息和执行计划是Oracle 数据库性能优化的关键概念。
统计信息为Oracle 优化器提供有关数据库对象的详细信息,有助于优化器制定高效的执行计划。
执行计划是Oracle 优化器根据统计信息和SQL 语句生成的执行SQL 语句的步骤。
了解这两个概念以及它们之间的关系对于优化数据库性能至关重要。
一、Oracle 统计信息的概念和作用Oracle 统计信息是关于数据库对象的详细数据,包括表、索引、约束等。
这些统计信息有助于Oracle 优化器在执行SQL 语句时选择最佳的执行计划。
统计信息可以显示表中的行数、列的数据分布、索引的使用情况等。
通过收集和维护这些统计信息,Oracle 优化器可以更好地了解数据库对象的结构和数据分布,从而生成更高效的执行计划。
二、Oracle 执行计划的概念和作用Oracle 执行计划是优化器根据统计信息和SQL 语句生成的执行SQL 语句的步骤。
执行计划包括访问路径、表连接、查询优化等。
优化器会根据统计信息和SQL 语句的特点选择最佳的执行计划,以提高查询效率。
执行计划可以在Oracle 数据库中使用EXPLAIN PLAN 命令查看。
三、Oracle 统计信息和执行计划的关系Oracle 统计信息和执行计划密切相关。
统计信息为优化器提供有关数据库对象的详细信息,有助于优化器制定高效的执行计划。
执行计划是优化器根据统计信息和SQL 语句生成的,它会使用统计信息来选择最佳的执行路径和查询优化策略。
因此,统计信息的质量和准确性对执行计划的优化至关重要。
四、如何查看和分析Oracle 执行计划要查看和分析Oracle 执行计划,可以使用以下方法:1.使用EXPLAIN PLAN 命令。
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中的执⾏过程或访问路径的描述。
即就是对⼀个查询任务,做出⼀份怎样去完成任务的详细⽅案。
⼆,执⾏计划的查看 设置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六种方法查看执行计划
Oracle六种⽅法查看执⾏计划⽬录:(⼀)六种执⾏计划(1)explain plan for(2)set autotrace on(3)statistics_level=all(4)dbms_xplan.display_cursor获取(5)事件10046 trace跟踪(6)awrsqrpt.sqlOracle提供了6种执⾏计划获取⽅法,各种⽅法侧重点不同。
第⼀种:explain for步骤⼀:explain for 查询sql语句步骤⼆:select * from table(dbms_xplan.display());/*优点:⽆需真正执⾏,快捷⽅便;缺点:1.没有输出相关统计信息,例如产⽣了多少逻辑读,多少次物理读,多少次递归调⽤的情况;2.⽆法判断处理了多少⾏;3.⽆法判断表执⾏了多少次*/第⼆种:set autotrace on步骤⼀:sql> set autotrace on traceonly;步骤⼆:sql>执⾏查询Sql语句步骤三:sql> set autotrace off;/*优点:1.可以输出运⾏时的相关统计信息(产⽣多少逻辑读、多少次递归调⽤、多少次物理读等);2.虽然要等语句执⾏完才能输出执⾏计划,但是可以有traceonly开关来控制返回结果不打屏输出;缺点:1.必须要等SQL语句执⾏完,才出结果;2.⽆法看到表被访问了多少次;*/第三种:(3)statistics_level=all步骤⼀:ALTER SESSION SET STATISTICS_LEVEL=ALL;步骤⼆:执⾏待分析的SQL步骤三:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));/*关键字解读:1.starts:SQL执⾏的次数;2.E-Rows:执⾏计划预计返回的⾏数;3.R-Rows:执⾏计划实际返回的⾏数;4.A-Time:每⼀步执⾏的时间(HH:MM:SS.FF),根据这⼀⾏可知SQL耗时在哪些地⽅;5.Buffers:每⼀步实际执⾏的逻辑读或⼀致性读;6.Reads:物理读;7.OMem:OMem为最优执⾏模式所需的内存评估值,这个数据是由优化器统计数据以及前⼀次执⾏的性能数据估算得出的;8.1Mem:1Mem为one-pass模式所需的内存评估值,当⼯作区⼤⼩⽆法满⾜操作所需的⼤⼩时,需要将部分数据写⼊临时磁盘空间中(如果仅需要写⼊⼀次就可以完成操作,就称⼀次通过,One-Pass;否则为多次通过,Multi-Pass).该列数据为语句最后⼀次执⾏中,单次写磁盘所需要的内存⼤⼩,这个由优化器统计数据以及前⼀次执⾏的性能数据估算得出的ed_Mem:Used-Mem则为当前操作实际执⾏时消耗的内存,括号⾥⾯为(发⽣磁盘交换的次数,1次即为One-Pass,⼤于1次则为Multi_Pass,如果没有使⽤磁盘,则显⽰0)*//*优点:1.可以清晰的从starts得出表被访问多少次;2.可以从E-Rows和A-Rows得到预测的⾏数和真实的⾏数,从⽽可以准确判断Oracle评估是否准确;3.虽然没有准确的输出运⾏时的相关统计信息,但是执⾏计划中的Buffers就是真实的逻辑读的数值;缺点:1.必须要等执⾏完后才能输出结果;2.⽆法控制结果打屏输出,不像autotrace可以设置traceonly保证不输出结果;3.看不出递归调⽤,看不出物理读的数值*/第四种:dbms_xplan.display_cursor获取步骤1:select * from table( dbms_xplan.display_cursor('&sql_id') ); --该⽅法是从共享池得到,如果SQL已被age out出share pool,则查找不到注释:1.还有1种⽅法,select * from table( dbms_xplan.display_awr('&sql_id') ); --该⽅法是从awr性能视图⾥⾯获取2.如果有多个执⾏计划,可⽤以下⽅法查出:select * from table(dbms_xplan.display_cursor('&sql_id',0));select * from table(dbms_xplan.display_cursor('&s ql_id',1));/*优点:1.知道sql_id即可得到执⾏计划,与explain plan for⼀样⽆需执⾏;2.可得到真实的执⾏计划缺点:1.没有输出运⾏的统计相关信息;2.⽆法判断处理了多少⾏;3.⽆法判断表被访问了多少次;*/第五种:事件10046 trace跟踪/*步骤1:alter session set events '10046 trace name context forever,level 12'; --开启追踪步骤2:执⾏sql语句;步骤3:alter session set events '10046 trace name context off'; --关闭追踪步骤4:select tracefile from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum<=1)); --找到跟踪后产⽣的⽂件步骤5:tkprof trc⽂件⽣成⽬标⽂件 sys=no sort=prsela,exeela,fchela --格式化命令*/第六种:awrsqrpt.sql/*步骤1:@?/rdbms/admin/awrsqrpt.sql步骤2:选择你要的断点(begin snap和end snap)步骤3:输⼊要查看的sql_id*/例⼦:见:(⼆)如何选择选择时⼀般遵循以下规则:1.如果sql执⾏很长时间才出结果或返回不了结果,⽤⽅法1:explain plan for2.跟踪某条sql最简单的⽅法是⽅法1:explain plan for,其次是⽅法2:set autotrace on3.如果相关查询某个sql多个执⾏计划的情况,只能⽤⽅法4:dbms_xplan.display_cursor或⽅法6:awrsqrpt.sql4.如果sql中含有函数,函数中有含有sql,即存在多层调⽤,想准确分析只能⽤⽅法5:10046追踪5.想法看到真实的执⾏计划,不能⽤⽅法1:explain plan for和⽅法2:set autotrace on6.想要获取表被访问的次数,只能⽤⽅法3:statistics_level = all。
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语句时所采用的查询方式和顺序。
通过查看执行计划,我们可以了解数据库是如何执行我们的SQL 语句的,从而对SQL语句的性能进行优化。
在本文中,我们将介绍如何查看Oracle数据库的执行计划,以及如何解读执行计划中的信息。
1. 使用EXPLAIN PLAN语句。
要查看一个SQL语句的执行计划,可以使用Oracle提供的EXPLAIN PLAN语句。
这个语句可以告诉数据库系统在执行SQL语句时将采用的查询方式和顺序。
例如,我们可以这样使用EXPLAIN PLAN语句:```sql。
EXPLAIN PLAN FOR。
SELECT FROM employees WHERE department_id = 10;```。
在这个例子中,我们让数据库解释执行计划,然后可以通过查询相关的数据字典表来获取执行计划的信息。
2. 查询执行计划信息。
在使用EXPLAIN PLAN语句之后,我们可以通过以下查询来获取执行计划的信息:```sql。
SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);```。
这个查询会返回执行计划的详细信息,包括每个步骤的操作类型、访问方法、访问对象等。
通过这些信息,我们可以了解数据库系统在执行SQL语句时所采用的具体方式,从而进行性能优化。
3. 解读执行计划。
执行计划中包含了很多信息,对于初学者来说可能有些晦涩。
但是,一旦掌握了一些基本的解读方法,就可以比较容易地理解执行计划了。
下面是一些常见的执行计划信息及其含义:ID,每个执行计划步骤的唯一标识符,可以用来区分不同的步骤。
Operation,操作类型,表示执行计划的具体操作,比如全表扫描、索引扫描、连接等。
Name,操作的具体对象,比如表名、索引名等。
Rows,估计的返回行数,表示数据库系统在执行该步骤时估计会返回多少行。
oracle执行计划怎么看
oracle执行计划怎么看Oracle执行计划怎么看。
Oracle数据库系统是当今世界上应用最广泛的关系型数据库管理系统之一,它的执行计划对于数据库性能的优化和调优起着至关重要的作用。
执行计划是Oracle数据库在执行SQL语句时生成的一种执行策略,它告诉我们数据库是如何执行SQL语句的,通过分析执行计划,我们可以了解SQL语句的执行效率,找到优化的空间,提高数据库的性能。
本文将介绍如何查看Oracle执行计划,以及如何解读执行计划,帮助大家更好地理解和优化SQL语句的执行效率。
一、查看执行计划的方法。
1. 使用EXPLAIN PLAN语句。
在Oracle中,我们可以使用EXPLAIN PLAN语句来获取SQL语句的执行计划。
具体的语法如下:EXPLAIN PLAN FOR。
SQL语句;然后可以使用如下语句来查看执行计划:SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);2. 使用AUTOTRACE。
在SQLPlus或者SQL Developer中,我们可以使用AUTOTRACE功能来查看SQL语句的执行计划。
在SQLPlus中,可以使用如下语句开启AUTOTRACE功能:SET AUTOTRACE ON;然后执行需要查看执行计划的SQL语句即可。
3. 使用SQL Developer。
对于Oracle数据库开发人员来说,SQL Developer是一个非常常用的工具,它提供了直观的图形界面来查看SQL语句的执行计划。
在SQL Developer中,执行SQL语句后,可以通过右键菜单选择“Explain Plan”来查看执行计划。
二、执行计划的解读。
1. 表的访问方式。
在执行计划中,我们可以看到表的访问方式,包括全表扫描、索引扫描、唯一索引扫描等。
全表扫描意味着数据库将会扫描整张表,而索引扫描则表示数据库将会利用索引来快速定位数据,不同的访问方式对于SQL语句的性能影响很大。
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:排序合并连接。
oracle执行计划详解
oracle执⾏计划详解⼀:什么是Oracle执⾏计划?执⾏计划是⼀条查询语句在Oracle中的执⾏过程或访问路径的描述⼆:怎样查看Oracle执⾏计划?因为我⼀直⽤的PLSQL远程连接的公司数据库,所以这⾥以PLSQL为例:①:配置执⾏计划需要显⽰的项:⼯具 —> ⾸选项 —> 窗⼝类型 —> 计划窗⼝ —> 根据需要配置要显⽰在执⾏计划中的列执⾏计划的常⽤列字段解释:基数(Rows):Oracle估计的当前操作的返回结果集⾏数字节(Bytes):执⾏该步骤后返回的字节数耗费(COST)、CPU耗费:Oracle估计的该步骤的执⾏成本,⽤于说明SQL执⾏的代价,理论上越⼩越好(该值可能与实际有出⼊)时间(Time):Oracle估计的当前操作所需的时间②:打开执⾏计划:在SQL窗⼝执⾏完⼀条select语句后按 F5 即可查看刚刚执⾏的这条查询语句的执⾏计划注:在PLSQL中使⽤SQL命令查看执⾏计划的话,某些SQL*PLUS命令PLSQL⽆法⽀持,⽐如SET AUTOTRACE ON三:看懂Oracle执⾏计划①:执⾏顺序:根据Operation缩进来判断,缩进最多的最先执⾏;(缩进相同时,最上⾯的最先执⾏)例:上图中 INDEX RANGE SCAN 和 INDEX UNIQUE SCAN 两个动作缩进最多,最上⾯的 INDEX RANGE SCAN 先执⾏;同⼀级如果某个动作没有⼦ID就最先执⾏同⼀级的动作执⾏时遵循最上最右先执⾏的原则例:上图中 TABLE ACCESS BY GLOBAL INDEX ROWID 和 TABLE ACCESS BY INDEX ROWID 两个动作缩进都在同⼀级,则位于上⾯的 TABLE ACCESS BY GLOBAL INDEX ROWID 这个动作先执⾏;这个动作⼜包含⼀个⼦动作 INDEX RANGE SCAN,则位于右边的⼦动作 INDEX RANGE SCAN 先执⾏;图⽰中的SQL执⾏顺序即为:INDEX RANGE SCAN —> TABLE ACCESS BY GLOBAL INDEX ROWID —> INDEX UNIQUE SCAN —> TABLE ACCESS BY INDEX ROWID —> NESTED LOOPS OUTER —> SORT GROUP BY —> SELECT STATEMENT, GOAL = ALL_ROWS(注:PLSQL提供了查看执⾏顺序的功能按钮(上图中的红框部分) )②:对图中动作的⼀些说明:1. 上图中 TABLE ACCESS BY … 即描述的是该动作执⾏时表访问(或者说Oracle访问数据)的⽅式;表访问的⼏种⽅式:(⾮全部)TABLE ACCESS FULL(全表扫描)TABLE ACCESS BY ROWID(通过ROWID的表存取)TABLE ACCESS BY INDEX SCAN(索引扫描)(1) TABLE ACCESS FULL(全表扫描):Oracle会读取表中所有的⾏,并检查每⼀⾏是否满⾜SQL语句中的 Where 限制条件;全表扫描时可以使⽤多块读(即⼀次I/O读取多块数据块)操作,提升吞吐量;使⽤建议:数据量太⼤的表不建议使⽤全表扫描,除⾮本⾝需要取出的数据较多,占到表数据总量的 5% ~ 10% 或以上(2) TABLE ACCESS BY ROWID(通过ROWID的表存取) :先说⼀下什么是ROWID?ROWID是由Oracle⾃动加在表中每⾏最后的⼀列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值;你可以像使⽤其它列⼀样使⽤它,只是不能对该列的值进⾏增、删、改操作;⼀旦⼀⾏数据插⼊后,则其对应的ROWID在该⾏的⽣命周期内是唯⼀的,即使发⽣⾏迁移,该⾏的ROWID值也不变。
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执行计划详解
oracle执行计划详解Oracle执行计划详解。
在Oracle数据库中,执行计划是指数据库系统为了执行SQL语句而选择的最佳执行路径。
通过分析执行计划,我们可以了解数据库是如何执行SQL语句的,以及如何优化查询性能。
本文将详细介绍Oracle执行计划的相关内容,希望能对大家有所帮助。
执行计划是由Oracle优化器生成的,它会根据表的统计信息、索引信息和系统参数等因素来选择最佳的执行路径。
执行计划通常以树状图的形式展现,其中包括了SQL语句的执行顺序、访问方法、访问顺序等信息。
在执行计划中,我们经常会遇到以下几种重要的概念:1. 访问方法,包括全表扫描、索引扫描、索引范围扫描、唯一索引扫描等。
不同的访问方法对于不同的查询条件和表结构会有不同的性能影响。
2. 访问顺序,包括顺序访问和随机访问。
顺序访问通常发生在全表扫描的情况下,而随机访问则通常发生在索引扫描的情况下。
顺序访问的性能往往优于随机访问。
3. 连接方法,包括嵌套循环连接、哈希连接和排序-合并连接。
不同的连接方法对于不同的连接条件和表大小会有不同的性能影响。
通过分析执行计划,我们可以了解SQL语句的执行状况,并且可以根据执行计划来进行SQL语句的优化。
比如,我们可以通过创建索引、重写SQL语句、调整统计信息等方式来改善执行计划,从而提升查询性能。
在实际的数据库应用中,执行计划往往是优化性能的关键。
一个高效的执行计划可以大大减少查询的响应时间,提升系统的整体性能。
因此,我们需要深入了解执行计划的生成原理和优化方法,以便能够更好地优化数据库应用。
总之,执行计划是数据库优化的重要工具,它可以帮助我们了解SQL语句的执行情况,并且可以指导我们进行优化工作。
通过深入研究执行计划,我们可以更好地掌握Oracle数据库的优化技巧,提升系统的性能和稳定性。
希望本文能够对大家对Oracle执行计划有所帮助,也希望大家能够在实际的数据库应用中灵活运用执行计划来优化系统性能。
Oracle查看执行计划的几种方法
Oracle查看执行计划的几种方法[object Object]在Oracle数据库中,有多种方法可以查看SQL查询语句的执行计划。
执行计划是指Oracle数据库在执行SQL查询语句时所采取的操作步骤和执行顺序。
以下是几种常用的查看执行计划的方法:1. 使用EXPLAIN PLAN语句:EXPLAIN PLAN是Oracle数据库提供的一个工具,可以用来查看SQL查询语句的执行计划。
使用EXPLAIN PLAN语句需要先执行SET AUTOTRACE ON语句,然后执行要查看执行计划的SQL查询语句。
执行计划将以文本的形式输出到屏幕上。
2. 使用AUTOTRACE功能:AUTOTRACE是Oracle数据库提供的一个功能,可以在执行SQL查询语句时自动显示执行计划和统计信息。
可以使用以下命令启用AUTOTRACE功能:````SETAUTOTRACEON;```然后执行要查看执行计划的SQL查询语句。
执行计划将以文本的形式输出到屏幕上。
3. 使用DBMS_XPLAN包:DBMS_XPLAN是Oracle数据库提供的一个包,可以用来查看SQL查询语句的执行计划。
使用DBMS_XPLAN包需要先执行SET AUTOTRACE OFF语句,然后执行要查看执行计划的SQL查询语句。
执行计划将以表格的形式输出到屏幕上。
````SETAUTOTRACEOFF;```````SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);```4. 使用V$SQL_PLAN视图:V$SQL_PLAN是Oracle数据库中的一个视图,可以用来查看SQL查询语句的执行计划。
可以使用以下命令查询V$SQL_PLAN视图:````SELECT * FROM V$SQL_PLAN WHERE SQL_ID = 'your_sql_id';```其中,'your_sql_id'是要查看执行计划的SQL查询语句的SQL ID。
查看ORACLE的实际执行计划
查看ORACLE的实际执⾏计划ORACLE的执⾏计划分为预估执⾏计划和实际执⾏计划。
其中,你⽤Toad、PL/SQL Developer、SQL Developer、EXPLAIN PLAN FOR 或者SET ATUOTRACE TRACEONLY等获取的执⾏计划都是预估的执⾏计划。
有时候预估执⾏计划和实际执⾏计划有很⼤的差别,所以有时候,调优的时候需要对⽐实际执⾏计划和预估的执⾏计划,不能被预估的执⾏计划给欺骗了。
那么我们怎么查看实际的执⾏计划呢?⽅法1:查询v$sql_plan视图中的实际执⾏计划1:在窗⼝执⾏下⾯SQL语句SELECT ENAME, SAL FROM SCOTT.EMP, SCOTT.DEPTWHERE EMP.DEPTNO =DEPT.DEPTNOAND DEPT.LOC='CHICAGO';2:查看执⾏SQL的SQL_IDSELECT'%SELECT ENAME, SAL FROM SCOTT.EMP, SCOTT.DEPT%' 3: 查看v$sql_plan视图SELECT * FROM v$sql_plan WHERE SQL_ID='7m5qbhn98j1xw';通过v$sql_plan视图查看实际执⾏计划,其实是不太现实的,因为阅读困难,可读性差,尤其是复杂SQL语句。
⽅法2:SET AUTOTRACE ON查看实际执⾏计划其实这种⽅式有很⼤的限制,例如SQL输出⼤量的记录,那么在SQL Plus⾥⾯就会刷屏,⽽且等待的时间较长;另外DML操作不能⽤这种⽅法。
所以其实也并不实⽤,只是作为⼀种⽅法罗列于此。
⽅法3:DBMS_XPLAN.DISPLAY_CURSOR查看实际执⾏计划DBMS_XPLAN这个包最初是在ORACLE 9i R2中引⼊的,⽤来查看Explain Plan⽣成的执⾏计划。
DBMS_XPLAN 在ORACLE 10g 以及ORACLE 11g中,功能都有所增长。
oracle 统计信息 执行计划
oracle 统计信息执行计划摘要:I.简介- 介绍Oracle统计信息和执行计划- 阐述统计信息在执行计划中的作用II.Oracle统计信息- 定义统计信息- 统计信息的种类- 统计信息的作用- 统计信息的收集和更新III.执行计划- 定义执行计划- 执行计划的构成- 执行计划的作用- 执行计划的生成和优化IV.统计信息与执行计划的关系- 统计信息在执行计划中的使用- 统计信息如何影响执行计划的生成和优化- 执行计划对统计信息的影响V.总结- 统计信息与执行计划在Oracle中的重要性- 如何合理使用和维护统计信息- 对未来发展的展望正文:Oracle统计信息与执行计划是数据库管理系统中非常重要的两个概念。
统计信息是数据库中描述数据特征的数据,而执行计划则是数据库在执行SQL语句时所采用的一种数据处理方案。
本文将详细介绍Oracle统计信息和执行计划的相关知识,包括它们的定义、种类、作用、收集和更新,以及它们之间的关系。
Oracle统计信息是描述数据库中数据特征的数据,包括表和索引的统计信息。
统计信息的种类很多,例如表的行数、列的最大值和最小值、索引的访问频率等。
统计信息在数据库管理中有着非常重要的作用,它可以为数据库的性能优化提供依据,帮助数据库管理员更好地理解数据库的使用情况,并对数据库进行合理的调整。
统计信息的收集和更新是由数据库自动完成的,当数据发生变化时,数据库会自动更新统计信息。
执行计划是数据库在执行SQL语句时所采用的一种数据处理方案,它描述了数据库如何处理SQL语句,包括语句的执行顺序、数据处理方式等。
执行计划是由数据库的优化器生成的,优化器会根据SQL语句和统计信息来生成最优的执行计划。
执行计划的作用是提高数据库的性能,使SQL语句能够更快速地执行。
统计信息与执行计划之间有着密切的关系。
统计信息是执行计划生成的依据之一,优化器会根据统计信息来选择最优的执行计划。
同时,执行计划也会影响统计信息的收集和更新,例如,执行计划的执行过程中,会对统计信息进行更新。
oracle执行计划怎么看
oracle执行计划怎么看Oracle执行计划是数据库优化调优中非常重要的一环,通过查看执行计划可以了解SQL语句的执行情况,以及是否存在性能瓶颈。
那么,我们应该如何来看Oracle执行计划呢?首先,我们需要知道执行计划是什么。
执行计划是Oracle数据库对SQL语句执行的一种解释,它告诉我们Oracle是如何执行SQL语句的,包括使用了哪些索引、连接方式、表的扫描顺序等信息。
通过执行计划,我们可以分析SQL语句的性能瓶颈,并进行相应的优化。
接下来,我们来看一下如何查看执行计划。
在Oracle中,我们可以使用explain plan语句来查看执行计划。
例如:```sql。
explain plan for。
SELECT FROM employees WHERE department_id = 20;```。
执行以上SQL语句后,可以使用如下语句来查看执行计划:```sql。
select from table(dbms_xplan.display);```。
通过以上命令,我们可以得到SQL语句的执行计划,包括每个步骤的操作类型、表的访问方式、访问行数等信息。
通过这些信息,我们可以分析SQL语句的执行情况,找出性能瓶颈所在。
在查看执行计划时,我们需要注意一些重要的信息。
首先是操作类型,常见的操作类型包括全表扫描、索引扫描、排序等。
不同的操作类型对性能的影响是不同的,我们需要根据实际情况进行分析和优化。
其次是访问方式,包括了表的访问顺序、连接方式等信息。
合理的访问方式可以提高SQL语句的执行效率。
最后是访问行数,通过访问行数我们可以了解SQL语句实际操作的数据量,从而评估SQL语句的性能。
除了使用explain plan语句来查看执行计划外,我们还可以通过SQL Developer等工具来可视化地查看执行计划。
这些工具可以直观地展现SQL语句的执行情况,帮助我们更好地进行性能优化。
在实际的优化过程中,我们还可以通过修改SQL语句、创建索引、重新设计表结构等方式来改善执行计划,从而提高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执行计划
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):表示使用索引来加速查询。
索引操作包括索引扫描、索引唯一扫描等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结果数据 执行计划
统计信息
www . ufsoft . com
使用Explain
1,删除上次解析数据 2,执行解析
delete from plan_table where STATEMENT_ID='testplan';
explain plan set STATEMENT_ID='testplan' for select * from dual;
where main.cadjpriceid=detail.CADJPRICEID and main.DADJPRICEDATE >= '2004-04-18' and detail.CINVENTORYID in (select pk_invmandoc from bd_invmandoc where bd_invmandoc.SEALFLAG='N');
A表全表扫描 A表排序
合并 输出结果集 B表全表扫描 B表排序
极少情况适合。只有包含两个表的决大多数记录的查询适 合。
www . ufsoft . com
Step1:全表扫描
对查询影响最大的就是全表扫描-Table Access Full.
•计执行划中所有的全表扫描都值得怀疑.除非是数据量非常小的表
Step2:驱动表-1
驱动表
•最内层的驱动表是不是能在执行过程中得到最小的中间数据集?
例如:查询销售订单明细,涉及三个表,订单主表,订单附表,存货 基本档案表。条件中包含:订单日期等于某天和存货编码等于某个 值。 方案一:如果以订单主表为驱动表,可以使用日期上的索引过滤出 所有的当天的订单,然后关联附表,最后再关联到存货档案表,过 滤出相应存货。
例如订单附表上有来源单据类型(srctype)和来源单据ID(srcid),建 立索引的顺序应该是srcid,srctype. 如果将srctype列作为先导列, 可能在查询时,没有srcid的条件也使用这个索引扫描,其结果是扫 描了大半个表,比全表扫描还慢。
www . ufsoft . com
Step5:非最优索引
www . ufsoft . com
执行计划
执行计划: Oracle内部的机器级代码,决定如何访问 存储器,得到需要的结果集。
执行计划的主要内容:访问方式,访问 顺序。
www . ufsoft . com
得到执行计划的方式
1.Explain(解释)
基本格式:explain plan set STATEMENT_ID='testplan' For Select ….. (Select,insert,update 等数据 操作语句均可) 2.Autotrace(自动跟踪) 基本使用方式:SQL> set autotrace on; (SQL PLUS中使 用)
OPTIONS
AGGREGATE
OBJECT_NAME
COST
18 5 2 2 1
FULL FULL BY INDEX ROWID UNIQUE SCAN
PRM_ADJUSTPRICE PRM_ADJUSTPRICE_B BD_INVMANDOC PK_BD_INVMANDOC
select count(*) from prm_adjustprice main,prm_adjustprice_b detail
怎样看执行计划
执行计划其实是一棵树,层次最深的最先执行,层次 相同,上面的先执行。显示时已经按照层次缩进,因 此从最里面的看起。最后一组就是驱动表。例:
OPERATION
SORT NESTED LOOPS HASH JOIN TABLE ACCESS TABLE ACCESS TABLE ACCESS INDEX
www . ufsoft . com
BEGIN
Oracle执行计划解读
培训教师 : 谢高兴
时 间 : 2006.4.27
www . ufsoft . com
SQL执行过程
1,解析SQL
•检查安全性 •检查SQL语法 •查询重新书写 2,执行 •创建执行计划
•捆绑执行计划 •执行执行计划 •读取结果集 3,显示结果集 4,转换字段数据
订单主表 日期索引 订单附表 存货档案表
主表PK 索引
存货主 键索引
www . ufsoft . com
Step2:驱动表-2
方案二:如果以存货档案为驱动表,可以使用编码上的索引过滤出 所有存货,然后关联订单附表,得到所有存货符合条件的订单附表 记录,最后再用订单附表上的主表主键关联主表,判断订单主表上 的日期是否符合条件,最后得到结果集。
statement_id
(80), (30), (30), (128), (30), (30),
(30), (255),
(255), (255), (255),
www . ufsoft . com
AUTO TRACE
SQL> set autotrace on; SQL> select * from dual; D X Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (FULL) OF 'DUAL' Statistics ---------------------------------------------------------0 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 372 bytes sent via SQL*Net to client 511 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed SQL>
www . ufsoft . com
Step6:数据非均匀分布
•对于某些SQL可能存在时快时慢,这个即可能是数据的分布不均导致 举例:做销售订单时,去判断此客户是否存在未结算订单。SQL语句:
Select .. From so_order,so_order_b,.. where so_order.pk=so_order_b.pk and ccustomerid=:1 and ……..
两个表,一个较小的驱动表和一个大表
驱动表 Hash_Area_Size RAM
RAM溢出使用临时表空间
大表
散列访问 ROWID
中间结果集非常大的情况下速度较快。
www . ufsoft . com
表连接操作3
3,排序合并连接-MERGE JOIN
两个表都使用全表扫描,分别进行排序,然后再合并成查 询的结果集。
www . ufsoft . com
表连接操作1
1,嵌套循环连接-NESTED LOOP
两个表,一个小的内部表和一个外部表
内部表 外部表索引
KEY ROWID
外部表
一般情况下速度较快,特别是中间结果集非常小的情况下 速度快。
www . ufsoft . com
表连接操作2
2,散列连接-HASH JOIN
•对一个表存在多个索引的列作为条件,解析中可能使用了非最优索引
使用提示,指定使用某个索引(存在SQL兼容问题,不推荐)
使用内置函数或运算使不想使用的条件列失效。
整型数据列+0
字符型加trim函数
•将索引尽可能多的使用条件
例如:在进行调拨的时候需要判断这个仓库中此存货不存在没有记帐的出库单 Select count(*) from XXX where pk_inv=:1 and status=0 这个查询会用到存货索引,但是速度还是慢。但是仔细分析会发现,其 实实际运行中没记帐的出库单比例很少,如果在存货索引上再加上状态 列,可以过滤更少的数据,速度将大大提高。
•索引不是越多越好。数据的插入,删除和修改都需要维护索引表, 也是有成本的。 •建议建索引的列。所有可能用做查询条件的日期列,客户列;附表 上的主表主键列,存货列,来源单据列;基本档案的编码列等。
www . ufsoft . com
Step4:复合索引列顺序
•对复合索引,应将重复值少的列作为先导列
www . ufsoft . com
索引访问方式
索引扫描:
从索引中读取一个或多个ROWID。索引值通常按照升序方式扫 描。 Oracle索 引
KEY
ROWID快速全索引扫来自:有些查询可以不扫描表只扫描索引就能得到期望的查询结果。所 有查询字段都在索引中指定;查询返回大于索引所有记录数的10%; 进行Count(*)操作。
3,显示执行计划
select lpad(' ',5*(level-1))||operation operation, options, object_name, cost,position from plan_table start with id=0 and STATEMENT_ID='testplan' connect by prior id=parent_id ;
驱动表
www . ufsoft . com
表访问方式
全表扫描:
读取表的每一条记录,顺序地从第一个数据块开始知道结尾 标志。
散列获取:
使用散列算法得到符号关键值的来确定记录所在的数据块。 它能减少数据读入量,但是存在重新定位记录的问题,只能 在静态表中使用。