精华内容
下载资源
问答
  • Oracle执行计划分析

    2011-12-29 14:37:00
    教你如何生成、分析Oracle SQL执行计划,让SQL调优更轻松。
  • Oracle执行计划使用分析SQL执行效率

    千次阅读 2016-05-03 20:12:50
    Oracle执行计划使用分析SQL执行效率

    #编译并执行SQL执行计划

    explain plan for

    //SQL语句

    #查看CPU使用情况

    select * from table(dbms_xplan.display)


    展开全文
  • 1、通过Oracle执行计划识别低效SQL及优化通过Oracle执行计划识别低效SQL、*、亠、兀1注意点对应执行计划简要分析返回行与逻辑读比率A-Rowsbuffers真实返回1行记录,花费1048个逻辑读,性能 有大问题1|1048...

    《通过Oracle执行计划识别低效SQL及优化》由会员分享,可在线阅读,更多相关《通过Oracle执行计划识别低效SQL及优化(2页珍藏版)》请在人人文库网上搜索。

    1、通过Oracle执行计划识别低效SQL及优化通过Oracle执行计划识别低效SQL、*、亠、兀1注意点对应执行计划简要分析返回行与逻辑读比率A-Rowsbuffers真实返回1行记录,花费1048个逻辑读,性能 有大问题1|1048评估值准确的重要性E-Rows |A-Rows评估32行,真实75888行,非常不准确,执行 计划的准确性让人怀疑| 11 | 1|7588832 |75888类型转换需认真关注|*1 | TABLE ACCESS FULL |T_C(O类型转换,一般用不上索引,所以是 fileter不 是 access23)Predicate in formati on (ide。

    2、 ntified1 - filter(TO NUMBER(“ID” )=请小心递归调用部分统计信息产生4321此递归调用 这一般是SQL带函数引发的4321 recursive calls 0 db block gets54321 con siste nt gets注意表的访冋次数Start | E-Rows |A-Rows表被访问了 80016次,偏多了,一般不考虑N1 连接,要考虑hash连接等1| 32|8001680016|1|75888注意表真实访问行数E-Rows |A -Rows1000 | 1000 70183| 10除了预测错外,要在执行计划中有count stopkey关键。

    3、字。还可能是rownum分页查询的 执行计划,表示在第10行就停止前进了谨慎观察排序与否统计信息1 sorts (memory) 0 sorts(disk) 73155 rows processed查看该SQL是否排序, 此处说明在内存中排序 并未到磁盘中排序通过逻辑结构调整来优化 SQL现象描述调整操作某统计语句较慢调整block大小,如从2KB调整为16KB某范围查询语句较慢从普通表调整为分区表某表删除大量记录后访问依然很慢释放咼水位线某数据库表空间查询结果返回很慢清除回收站对象某应用系统的表记录插入慢将频繁自动扩展的表空间改成固定尺寸,且设置较大值,避免频繁扩展某等值查询语句慢添加索引改。

    4、成索引扫描使用rowid扫描避免类型转换避免使用函数如funci (col) =123通过表结构设计来优化 SQL现象描述调整操作索引失效导致分区大表用不到索引确认是否执行过导致 索引失效的操作全分区扫描增加适当分区,使查询落在指定分区,避免全区扫描数据全部落入默认分区,查询缓慢将默认分区做split分区,同时增加分区表各分区比例 监控分区表建立局部索引,但是 SQL用不上分区条件,导 致扫描许多小索引将分区表的局部索引调整为全局索引对全局临时表手机信息导致执行计划错误,sql性能低不收集全局临时表统计信息接口程序中根据不同业务设计了多张接口表,导致并 发受到影响,清理数据开销也大改造接口表,统 成 张全局临时表一条SQL关联10多个表,性能较低通过将某关键表的字段进行扩充,将表连接中需要的 字段都融入到这个表中。

    展开全文
  • oracle执行计划分析

    千次阅读 2016-04-15 15:24:24
    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能一般通过查看该sql的执行计划。 一、什么是执行计划 一条查询语句在oracle中的执行过程或...

    

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能一般通过查看该sql的执行计划。

    一、什么是执行计划

          一条查询语句在oracle中的执行过程或访问路径的描述。

    二、如何查看执行计划

           1、set autotrace on;

           2、explain plan for sql语句;

                select plan_table_output from table(dbms_xplan.display());

          3、通过第3方工具,如plsql developer(f5查看执行计划)、toad等
    三、执行计划详细分析

     

    SQL> explain plan for select * from scott.emp a,scott.emp b where a.empno=b.mgr and b.mgr is not null;
     
    Explained
     
    SQL> select plan_table_output from table(dbms_xplan.display());
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    ----------------------------------------------------------------------------
    | Id  | Operation                    |  Name       | Rows  | Bytes | Cost  |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |             |       |       |       |
    |   1 |  NESTED LOOPS                |             |       |       |       |
    |*  2 |   TABLE ACCESS FULL          | EMP         |       |       |       |
    |   3 |   TABLE ACCESS BY INDEX ROWID| EMP         |       |       |       |
    |*  4 |    INDEX UNIQUE SCAN         | PK_EMP      |       |       |       |
    ----------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - filter("B"."MGR" IS NOT NULL)
       4 - access("A"."EMPNO"="B"."MGR")
    Note: rule based optimization
     
    18 rows selected

     

     

     

    四、计划列字段解释:

    1、Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。 一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)
    如:上面执行计划的执行顺序为:4-->2-->3-->1-->0
    2、Operation: 当前操作的内容。
    3、Name:操作对象
    4、Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。
    --Rows的值对于CBO做出正确的执行计划来说至关重要。 如果CBO获得的Rows值不够准确(通常是没有做分析或者分析数据过旧造成),在执行计划成本计算上就会出现偏差,从而导致CBO错误的制定出执行计划。在多表关联查询或者SQL中有子查询时,每个关联表或子查询的Rows的值对主查询的影响都非常大,甚至可以说,CBO就是依赖于各个关联表或者子查询Rows值计算出最后的执行计划。 对于多表查询,CBO使用每个关联表返回的行数(Rows)决定用什么样的访问方式来做表关联(如Nested loops Join 或 hash Join)。
    5、Bytes:表示执行该步骤后返回的字节数。
    6、Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。
    7、Time:Oracle 估计当前操作的时间。

    五、谓词说明:

     

    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - filter("B"."MGR" IS NOT NULL)
       4 - access("A"."EMPNO"="B"."MGR")

     

    Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)
    Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
    在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。

    六、统计信息说明:

          db block gets      : 从buffer cache中读取的block的数量
          consistent gets   : 从buffer cache中读取的undo数据的block的数量
          physical reads    : 从磁盘读取的block的数量
          redo size            : DML生成的redo的大小
          sorts (memory)  :在内存执行的排序量
          sorts (disk)        :在磁盘上执行的排序量

    七、 动态分析

    如果在执行计划中有如下提示:

     

    Note
    ------------
    -dynamic sampling used for the statement

     

    这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可能没有做过分析。

    这里会出现两种情况:

    1、如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。
    2、如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

    八、表访问方式
    1、Full Table Scan (FTS) 全表扫描
    2、Index Lookup 索引扫描,共分五小类

     2.1、index unique scan     --索引唯一扫描
     2.2、index range scan      --索引局部扫描
     2.3、index full scan       --索引全局扫描
     2.4、index fast full scan  --索引快速全局扫描,不带order by情况下常发生
     2.5、index skip scan       --索引跳跃扫描,where条件列是非索引的前导列情况下常发生

    3、Rowid 物理ID扫描,Rowid扫描是最快的访问数据方式

    九、运算符
    1、sort --排序,很消耗资源

    如下几个操作会引发排序运算
    a、order by clauses b、group by c、sort merge join

    2、filter --过滤,如not in、min函数等容易产生

    3.view --视图,大都由内联视图产生(可能深入到视图基表)

    4.partition view --分区视图

    十、oracle优化器(Optimizer)

    Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle 以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE JOIN。 这些因素直接决定SQL的执行效率,所以优化器是SQL 执行的核心,它做出的执行计划好坏,直接决定着SQL的执行效率。

    Oracle 的优化器有两种:

    1、RBO(Rule-Based Optimization): 基于规则的优化器
    2、CBO(Cost-Based Optimization): 基于代价的优化器

    从Oracle 10g开始,RBO 已经被弃用,但是我们依然可以通过Hint方式来使用它。

    在Oracle 10g中,CBO 可选的运行模式有2种:
    1、FIRST_ROWS(n)
    Oracle 在执行SQL时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。
    2、ALL_ROWS -- 10g中的默认值
    Oracle 会用最快的速度将SQL执行完毕,将结果集全部返回,它和FIRST_ROWS(n)的区别在于,ALL_ROWS强调以最快的速度将SQL执行完毕,并将所有的结果集反馈回来,而FIRST_ROWS(n)则侧重于返回前n条记录的执行时间。

    修改CBO 模式的三种方法:

    1、SQL 语句:

    Sessions级别:

     

    SQL> alter session set optimizer_mode=all_rows;

     

    2、修改pfile 参数:

    OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS

    3、语句级别用Hint(/* + ... */)来设定

     

    Select /*+ first_rows(10) */ name from table;
    Select /*+ all_rows */ name from table;

     

     

     

     

     

     

    展开全文
  • Oracle执行计划

    千次阅读 2018-07-08 09:51:29
    一:什么是Oracle执行计划?执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划?因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例:①:配置执行计划需要显示...

    一:什么是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

    执行计划sql查看

     

     

     

    三:看懂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

    ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值;

    你可以像使用其它列一样使用它,只是不能对该列的值进行增、删、改操作;

    一旦一行数据插入后,则其对应的ROWID在该行的生命周期内是唯一的,即使发生行迁移,该行的ROWID值也不变。

    让我们再回到 TABLE ACCESS BY ROWID 来:

    行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID可以快速定位到目标数据上,这也是Oracle中存取单行数据最快的方法;

    (3) TABLE ACCESS BY INDEX SCAN(索引扫描):

    在索引块中,既存储每个索引的键值,也存储具有该键值的行的ROWID。

    一个数字列上建索引后该索引可能的概念结构如下图:

    index

    所以索引扫描其实分为两步:

    Ⅰ:扫描索引得到对应的ROWID

    Ⅱ:通过ROWID定位到具体的行读取数据

    ----------------索引扫描延伸-------------------

    索引扫描又分五种:

    • INDEX UNIQUE SCAN(索引唯一扫描)
    • INDEX RANGE SCAN(索引范围扫描)
    • INDEX FULL SCAN(索引全扫描)
    • INDEX FAST FULL SCAN(索引快速扫描)
    • INDEX SKIP SCAN(索引跳跃扫描)

    a) INDEX UNIQUE SCAN(索引唯一扫描):

    针对唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;

    表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle常实现唯一性扫描;

    b) INDEX RANGE SCAN(索引范围扫描):

    使用一个索引存取多行数据;

    发生索引范围扫描的三种情况:

    • 在唯一索引列上使用了范围操作符(如:>   <   <>   >=   <=   between)
    • 在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)
    • 对非唯一索引列上进行的任何查询

    c) INDEX FULL SCAN(索引全扫描):

    进行全索引扫描时,查询出的数据都必须从索引中可以直接得到(注意全索引扫描只有在CBO模式下才有效)

    ----------------------- 延伸阅读:Oracle优化器简述 -----------------------

    Oracle中的优化器是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。

    Oracle的优化器有两种:

    • RBO(Rule-Based Optimization) 基于规则的优化器
    • CBO(Cost-Based Optimization) 基于代价的优化器

    RBO:

    RBO有严格的使用规则,只要按照这套规则去写SQL语句,无论数据表中的内容怎样,也不会影响到你的执行计划;

    换句话说,RBO对数据“不敏感”,它要求SQL编写人员必须要了解各项细则;

    RBO一直沿用至ORACLE 9i,从ORACLE 10g开始,RBO已经彻底被抛弃。

    CBO:

    CBO是一种比RBO更加合理、可靠的优化器,在ORACLE 10g中完全取代RBO;

    CBO通过计算各种可能的执行计划的“代价”,即COST,从中选用COST最低的执行方案作为实际运行方案;

    它依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择,也就是对数据“敏感”。

    ---------------------------------------------------------------------

    d) INDEX FAST FULL SCAN(索引快速扫描):

    扫描索引中的所有的数据块,与 INDEX FULL SCAN 类似,但是一个显著的区别是它不对查询出的数据进行排序(即数据不是以排序顺序被返回)

    e) INDEX SKIP SCAN(索引跳跃扫描):

    Oracle 9i后提供,有时候复合索引的前导列(索引包含的第一列)没有在查询语句中出现,oralce也会使用该复合索引,这时候就使用的INDEX SKIP SCAN;

    什么时候会触发 INDEX SKIP SCAN 呢?

    前提条件:表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件,并且优化器模式为CBO时

    当Oracle发现前导列的唯一值个数很少时,会将每个唯一值都作为常规扫描的入口,在此基础上做一次查找,最后合并这些查询;

    例如:

    假设表emp有ename(雇员名称)、job(职位名)、sex(性别)三个字段,并且建立了如 create index idx_emp on emp (sex, ename, job) 的复合索引;

    因为性别只有 '男' 和 '女' 两个值,所以为了提高索引的利用率,Oracle可将这个复合索引拆成 ('男', ename, job),('女', ename, job) 这两个复合索引;

    当查询 select * from emp where job = 'Programmer' 时,该查询发出后:

    Oracle先进入sex为'男'的入口,这时候使用到了 ('男', ename, job) 这条复合索引,查找 job = 'Programmer' 的条目;

    再进入sex为'女'的入口,这时候使用到了 ('女', ename, job) 这条复合索引,查找 job = 'Programmer' 的条目;

    最后合并查询到的来自两个入口的结果集。

    ----------------------------------------------

     

    2. 上图中的 NESTED LOOPS … 描述的是表连接方式;

    JOIN 关键字用于将两张表作连接,一次只能连接两张表,JOIN 操作的各步骤一般是串行的(在读取做连接的两张表的数据时可以并行读取);

    表(row source)之间的连接顺序对于查询效率有很大的影响,对首先存取的表(驱动表)先应用某些限制条件(Where过滤条件)以得到一个较小的row source,可以使得连接效率提高。

    -------------------------延伸阅读:驱动表(Driving Table)与匹配表(Probed Table)-------------------------

    驱动表(Driving Table):

    表连接时首先存取的表,又称外层表(Outer Table),这个概念用于 NESTED LOOPS(嵌套循环) 与 HASH JOIN(哈希连接)中;

    如果驱动表返回较多的行数据,则对所有的后续操作有负面影响,故一般选择小表(应用Where限制条件后返回较少行数的表)作为驱动表。

    匹配表(Probed Table):

    又称为内层表(Inner Table),从驱动表获取一行具体数据后,会到该表中寻找符合连接条件的行。故该表一般为大表(应用Where限制条件后返回较多行数的表)。

    ---------------------------------------------------------------------------------------------------------

    表连接的几种方式:

    • SORT MERGE JOIN(排序-合并连接)
    • NESTED LOOPS(嵌套循环)
    • HASH JOIN(哈希连接)
    • CARTESIAN PRODUCT(笛卡尔积)

    注:这里将首先存取的表称作 row source 1,将之后参与连接的表称作 row source 2;

    (1) SORT MERGE JOIN(排序-合并连接):

    假设有查询:select a.name, b.name from table_A a join table_B b on (a.id = b.id)

    内部连接过程:

    a) 生成 row source 1 需要的数据,按照连接操作关联列(如示例中的a.id)对这些数据进行排序

    b) 生成 row source 2 需要的数据,按照与 a) 中对应的连接操作关联列(b.id)对数据进行排序

    c) 两边已排序的行放在一起执行合并操作(对两边的数据集进行扫描并判断是否连接)

    延伸:

    如果示例中的连接操作关联列 a.id,b.id 之前就已经被排过序了的话,连接速度便可大大提高,因为排序是很费时间和资源的操作,尤其对于有大量数据的表。

    故可以考虑在 a.id,b.id 上建立索引让其能预先排好序。不过遗憾的是,由于返回的结果集中包括所有字段,所以通常的执行计划中,即使连接列存在索引,也不会进入到执行计划中,除非进行一些特定列处理(如仅仅只查询有索引的列等)。

    排序-合并连接的表无驱动顺序,谁在前面都可以;

    排序-合并连接适用的连接条件有: <   <=   =   >   >= ,不适用的连接条件有: <>    like

    (2) NESTED LOOPS(嵌套循环):

    内部连接过程:

    a) 取出 row source 1 的 row 1(第一行数据),遍历 row source 2 的所有行并检查是否有匹配的,取出匹配的行放入结果集中

    b) 取出 row source 1 的 row 2(第二行数据),遍历 row source 2 的所有行并检查是否有匹配的,取出匹配的行放入结果集中

    c) ……

    若 row source 1 (即驱动表)中返回了 N 行数据,则 row source 2 也相应的会被全表遍历 N 次。

    因为 row source 1 的每一行都会去匹配 row source 2 的所有行,所以当 row source 1 返回的行数尽可能少并且能高效访问 row source 2(如建立适当的索引)时,效率较高。

    延伸:

    嵌套循环的表有驱动顺序,注意选择合适的驱动表。

    嵌套循环连接有一个其他连接方式没有的好处是:可以先返回已经连接的行,而不必等所有的连接操作处理完才返回数据,这样可以实现快速响应。

    应尽可能使用限制条件(Where过滤条件)使驱动表(row source 1)返回的行数尽可能少,同时在匹配表(row source 2)的连接操作关联列上建立唯一索引(UNIQUE INDEX)或是选择性较好的非唯一索引,此时嵌套循环连接的执行效率会变得很高。若驱动表返回的行数较多,即使匹配表连接操作关联列上存在索引,连接效率也不会很高。

    (3)HASH JOIN(哈希连接) :

    哈希连接只适用于等值连接(即连接条件为  =  )

    HASH JOIN对两个表做连接时并不一定是都进行全表扫描,其并不限制表访问方式;

    内部连接过程简述:

    a) 取出 row source 1(驱动表,在HASH JOIN中又称为Build Table) 的数据集,然后将其构建成内存中的一个 Hash Table(Hash函数的Hash KEY就是连接操作关联列),创建Hash位图(bitmap)

    b) 取出 row source 2(匹配表)的数据集,对其中的每一条数据的连接操作关联列使用相同的Hash函数并找到对应的 a) 里的数据在 Hash Table 中的位置,在该位置上检查能否找到匹配的数据

    ----------------延伸阅读:Hash Table相关----------------

    来自Wiki的解释:

    In computing, a hash table (hash map) is a data structure used to implement an associative array, a structure that can map keys to values. A hash table uses a hash function to compute an index into an array of buckets or slots, from which the desired value can be found.

    散列(hash)技术:在记录的存储位置和记录具有的关键字key之间建立一个对应关系 f ,使得输入key后,可以得到对应的存储位置 f(key),这个对应关系 f 就是散列(哈希)函数;

    采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间就是散列表(哈希表);

     不同的key经同一散列函数散列后得到的散列值理论上应该不同,但是实际中有可能相同,相同时即是发生了散列(哈希)冲突,解决散列冲突的办法有很多,比如HashMap中就是用链地址法来解决哈希冲突;

    哈希表是一种面向查找的数据结构,在输入给定值后查找给定值对应的记录在表中的位置以获取特定记录这个过程的速度很快。

    --------------------------------------------------------

    HASH JOIN的三种模式:

    • OPTIMAL HASH JOIN
    • ONEPASS HASH JOIN
    • MULTIPASS HASH JOIN

    1) OPTIMAL HASH JOIN:

    OPTIMAL 模式是从驱动表(也称Build Table)上获取的结果集比较小,可以把根据结果集构建的整个Hash Table都建立在用户可以使用的内存区域里。

    optimal_hash_join

    连接过程简述:

    Ⅰ:首先对Build Table内各行数据的连接操作关联列使用Hash函数,把Build Table的结果集构建成内存中的Hash Table。如图所示,可以把Hash Table看作内存中的一块大的方形区域,里面有很多的小格子,Build Table里的数据就分散分布在这些小格子中,而这些小格子就是Hash Bucket(见上面Wiki的定义)。

    Ⅱ:开始读取匹配表(Probed Table)的数据,对其中每行数据的连接操作关联列都使用同上的Hash函数,定位Build Table里使用Hash函数后具有相同值数据所在的Hash Bucket。

    Ⅲ:定位到具体的Hash Bucket后,先检查Bucket里是否有数据,没有的话就马上丢掉匹配表(Probed Table)的这一行。如果里面有数据,则继续检查里面的数据(驱动表的数据)是否和匹配表的数据相匹配。

    2): ONEPASS HASH JOIN :

    从驱动表(也称Build Table)上获取的结果集较大,无法将根据结果集构建的Hash Table全部放入内存中时,会使用 ONEPASS 模式。

    one_pass_hash_join

    连接过程简述:

    Ⅰ:对Build Table内各行数据的连接操作关联列使用Hash函数,根据Build Table的结果集构建Hash Table后,由于内存无法放下所有的Hash Table内容,将导致有的Hash Bucket放在内存里,有的Hash Bucket放在磁盘上,无论放在内存里还是磁盘里,Oracle都使用一个Bitmap结构来反映这些Hash Bucket的状态(包括其位置和是否有数据)。

    Ⅱ:读取匹配表数据并对每行的连接操作关联列使用同上的Hash函数,定位Bitmap上Build Table里使用Hash函数后具有相同值数据所在的Bucket。如果该Bucket为空,则丢弃匹配表的这条数据。如果不为空,则需要看该Bucket是在内存里还是在磁盘上。

    如果在内存中,就直接访问这个Bucket并检查其中的数据是否匹配,有匹配的话就返回这条查询结果。

    如果在磁盘上,就先把这条待匹配数据放到一边,将其先暂存在内存里,等以后积累了一定量的这样的待匹配数据后,再批量的把这些数据写入到磁盘上(上图中的 Dump probe partitions to disk)。

    Ⅲ:当把匹配表完整的扫描了一遍后,可能已经返回了一部分匹配的数据了。接下来还有Hash Table中一部分在磁盘上的Hash Bucket数据以及匹配表中部分被写入到磁盘上的待匹配数据未处理,现在Oracle会把磁盘上的这两部分数据重新匹配一次,然后返回最终的查询结果。

    3): MULTIPASS HASH JOIN:

    当内存特别小或者相对而言Hash Table的数据特别大时,会使用 MULTIPASS 模式。MULTIPASS会多次读取磁盘数据,应尽量避免使用该模式。

     

    3. 上图中的 … OUTER 描述的是表连接类型;

    表连接的两种类型:

    • INNER JOIN(内连接)
    • OUTER JOIN(外连接)

    示例数据说明:

    现有A、B两表,A表信息如下:

    table_A

    B表信息如下:

    table_B

    下面的例子都用A、B两表来演示。

    (1) INNER JOIN(内连接):

    只返回两表中相匹配的记录。

    INNER JOIN 又分为两种:

    • 等值连接(连接条件为  = )
    • 非等值连接(连接条件为 非 =  ,如  >  >=  <  <=  等)

    等值连接用的最多,下面以等值连接举例:

    内连接的两种写法:

    Ⅰ: select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a inner join B b on (a.id = b.id)

    Ⅱ: select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a join B b on (a.id = b.id)

    连接时只返回满足连接条件(a.id = b.id)的记录:

    inner_join

    (2) OUTER JOIN(外连接):

    OUTER JOIN 分为三种:

    • LEFT OUTER JOIN(可简写为 LEFT JOIN,左外连接)
    • RIGHT OUTER JOIN( RIGHT JOIN,右外连接)
    • FULL OUTER JOIN( FULL JOIN,全外连接)

    a) LEFT JOIN(左连接):

    返回的结果不仅包含符合连接条件的记录,还包含左边表中的全部记录。(若返回的左表中某行记录在右表中没有匹配项,则右表中的返回列均为空值)

    两种写法:

    Ⅰ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a left outer join B b on (a.id = b.id)

    Ⅱ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a left join B b on (a.id = b.id)

    返回结果:

    left_join

    b) RIGHT JOIN(右连接):

    返回的结果不仅包含符合连接条件的记录,还包含右边表中的全部记录。(若返回的右表中某行记录在左表中没有匹配项,则左表中的返回列均为空值)

    两种写法:

    Ⅰ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a right outer join B b on (a.id = b.id)

    Ⅱ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a right join B b on (a.id = b.id)

    返回结果:

    right_join

    c) FULL JOIN(全连接):

    返回左右两表的全部记录。(左右两边不匹配的项都以空值代替)

    两种写法:

    Ⅰ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a full outer join B b on (a.id = b.id)

    Ⅱ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a full join B b on (a.id = b.id)

    返回结果:

    full_join

    ---------------------延伸阅读: (+) 操作符-------------------

    (+) 操作符是Oracle特有的表示法,用来表示外连接(只能表示 左外、右外 连接),需要配合Where语句使用。

    特别注意:(+) 操作符在左表的连接条件上表示右连接,在右表的连接条件上表示左连接。

    如:

    Ⅰ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a, B b where a.id = b.id(+)

    查询结果:

    右边( )

    实际与左连接 select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a left join B b on (a.id = b.id) 效果等价

    Ⅱ:select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a, B b where a.id(+) = b.id

    查询结果:

    左边( )

    实际与右连接 select a.id A_ID, a.name A_NAME, b.id B_ID, b.name B_NAME from A a right join B b on (a.id = b.id) 效果等价

    本文转自:https://www.cnblogs.com/Dreamer-1/p/6076440.html


    展开全文
  • Oracle执行计划详解

    2016-01-03 13:36:44
    Oracle执行计划详解,包括oracle执行顺序和索引详细介绍
  • 针对Oracle性能的优化,了解sql语句的执行计划,对性能优化起到很好的指导作用!
  • Oracle 执行计划分析

    2019-07-30 09:25:52
    参考 https://www.cnblogs.com/Dreamer-1/p/6076440.html
  • oracle执行计划解读

    2015-02-02 14:52:37
    什么是执行计划,如何访问数据,执行计划层次关系、例子解说等几个方面,全面介绍oracle执行计划说明,并进一步给出优化建议等相关内容。
  • 执行计划可以用来分析SQL的性能   一、查看执行计划的方法 1. 设置autotrace  set autotrace off: 此为默认值,即关闭autotrace  set autotrace on explain: 只显示执行计划  set autotrace on statistics...
  • (1)什么是执行计划 SQL是一种傻瓜式语言,每一个条件就是一个需求,访问的顺序不同就形成了不同的执行计划。...执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 (2)执行计划的选择 通常一...
  • Oracle总结(一):Oracle执行计划

    千次阅读 2019-01-15 11:25:11
    看懂Oracle执行计划 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing… 1.什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问...
  • AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计。SQL*Plus AUTOTRACE可以用来替代SQL Trace使用,AUTOTRACE的好处是您不必设置跟踪文件的格式,并且它将自动为...
  • oracle 执行计划 建立与阅读 在进行语句性能分析时,提取语句执行计划,是重要的分析手段。Oracle数据库有多种获得执行计划方式,以下进行简要介绍
  • Oracle解释计划执行方式,数据分析原理。SQL优化原理。 教你如何看懂执行计划 --大伟哥
  • oracle 执行计划 详解

    2012-11-22 21:04:37
    自己动手总结出来的所有的东西都有例子,执行计划分析,访问路径分析,执行顺序分析方法,执行计划的解读方法,刚近公司,带我的人要我做的,也是想帮我好好理解,现在拿来分享下
  • 执行计划概念 ...Oracle查看执行计划 a. explain plan for (SQL); select * from table(dbms_xplan.display); --select * from table(dbms_xplan.display()); --SELECT plan_table_outp...
  • oracle-表分析 执行计划

    千次阅读 2019-06-05 20:49:16
    请对test_new表进行表分析 ...请对以下语句生成执行计划,确保数据查询使用索引,保留执行计划到explain.sql文件,该文件自己创建。 set autotrace traceonly; select * from test_new where object_name='...
  • Oracle执行计划Explain Plan 如何使用

    千次阅读 2019-01-11 21:26:33
    Oracle执行计划Explain Plan 1.1 概念 概念:一条查询语句在ORACLE中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。 如果要分析某条SQL的性能问题,通常我们要先看SQL的...
  • 读懂oracle执行计划

    2017-10-17 21:37:36
    大神专业讲解oracle执行计划,全面分析数据库执行计划的方方面面
  • ORACLE执行计划学习

    2017-04-11 10:46:32
    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行...
  • oracle执行计划与效率

    千次阅读 2018-04-03 09:22:55
    一:什么是Oracle执行计划?执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述,注意,是查询语句。 二:怎样查看Oracle执行计划?以PLSQL为例:执行计划的常用列字段解释:基数(Rows):Oracle估计的...
  • 分析oracle执行计划(explain plan)

    千次阅读 2013-07-18 11:33:33
    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对sql...
  • 答:在你运用SQL语言,向数据库发布一条查询语句时,Oracle将伴随产生一个“执行计划”,也就是该语句将通过何种数据搜索方案执行,是通过全表扫描、还是通过索引搜寻等其它方式。搜索方案的选用与Oracle的优化器...
  • 看懂Oracle执行计划

    千次阅读 多人点赞 2018-03-06 11:46:06
    最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing… 一:什么是Oracle执行计划?执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看...
  • 如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题。 看懂执行计划也就成了SQL优化的先决条件。 通过执行计划定位性能问题,定位后就通过建立索引、修改sql
  • 查看oracle执行计划

    千次阅读 2012-07-20 14:02:20
    查看oracle执行计划  第一步:登入sql/plus执行命令(无先后顺序)  set time on -- (说明:打开时间显示)  set autotrace on --(说明:打开自动分析统计,并显示SQL语句的运行结果)  set autotrace ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 178,856
精华内容 71,542
关键字:

如何分析oracle的执行计划