解释计划 与 执行计划的 区别

随着可以得到解释计划输出的开发工具, 比如 toad 的普遍使用, 生成解释计划就变的相当简单. 而不简单的是得到执行计划.

解释计划

EXPLAIN PLAN 用来显示优化器为SQL语句所选择的执行计划. 你需要了解一件事, 当你得到了解释计划输出的时候, 你其实是得到了当SQL语句执行的时候应该采用的预期执行计划. 你并没有得到实际的执行计划以及与其相关的数据源执行统计信息. 你所得到的只是估计值, 而不是实际值. 在下面, 我将通过将估计的信息成为解释计划输出而把实际信息成为执行计划输出来区分实际的和预期的执行计划.

解释计划输出最令人沮丧的地方就是它与实际执行时所使用的计划可能是不一致的. 使用解释计划的时候有以下3点可能导致计划输出与实际执行计划不一致的地方.

  • 解释计划是基于你使用它的时候的环境来生成的
  • 解释计划不考虑绑定变量的数据类型(所有的绑定变量都是 varchar2的)
  • 解释计划不”窥视”绑定变量的值.

解释计划不考虑绑定变量的数据类型并假设所有的绑定变量都是字符串类型的方式. 然而, 当语句真正执行的时候所准备的执行计划却要考虑数据类型. 需要牢记的一个预期行为: 谓语(where语句中的那些条件)必须严格匹配索引定义, 否则不会使用索引.

阅读计划

按照执行计划的顺序显示

select id, parent_id, operation

from (

select level lvl, id, parment_id, lpad(‘’, level) || operation || ‘’ ||options || ‘’ || object_name as operation

from plan_table

start with id = 0

connect by prior_id = parent_id

)

order by lvl desc, id;

解释计划输出中最有用的部分之一就是被称为谓语信息的部分, 在这个部分中, 将会示出 ACCESS_PREDICATES 和 FILTER_PREDICATES 列, 这两列与计划运算列表中的一行(用ID列来指示)相关, 你会发现计划中每一个有相关的访问或筛选谓语的运算, 在其ID的旁边都有一个星号(*), 当你看到星号的时候, 你就知道要在谓语信息部分寻找ID号来确定哪个谓语(where子句中的条件) 是与该运算相关的. 通过使用这些信息你就可以确认用来进行索引访问的列是正确(或不正确)的, 并且可以确定在哪里进行了条件过滤.

较晚的进行过滤时常见的性能抑制剂.

执行计划

当一条SQL语句执行的时候将会生成该语句的实际执行计划. 在语句被硬解析之后, 所选的执行计划就会被存到库告诉缓存中以便以后使用. 可以通过查询 v$SQL_PLAN来查看计划运算.

查询最近生成的SQL语句: V$SQL

查看相关执行计划

有好几种方法可以用来查看任何值钱已经执行过的SQL语句保存在库高速缓存中的执行计划.

1. 利用 dbms_xplan.display_cursor 函数

select /*+ gather_plan_statistics */ empno, ename from scott.emp where ename = ‘KING’;

set serveroutput off

select * from table(dbms_xplan.display_cursor(null, null, ‘ALLSTATS LAST’));

06 SQL执行计划的更多相关文章

  1. Oracle查看SQL执行计划的方式

    Oracle查看SQL执行计划的方式     获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式:   基本有以下几种方式: ...

  2. Atitit sql执行计划

    Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...

  3. 查看SQL执行计划

    一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call     count       cpu    elapsed       disk       ...

  4. 查看Oracle SQL执行计划的常用方式

    在查看SQL执行计划的时候有很多方式 我常用的方式有三种 SQL> explain plan for 2 select * from scott.emp where ename='KING'; ...

  5. sql执行计划解析案例(二)

    sql执行计划解析案例(二)   今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究.但是在研究cache buffe ...

  6. Oracle之SQL优化专题01-查看SQL执行计划的方法

    在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...

  7. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

  8. DB查询分析器7.01新增的周、月SQL执行计划功能

                DB查询分析器7.01新增的周.月SQL执行计划功能 马根峰              (广东联合电子服务股份有限公司, 广州 510300) 1      引言   中国本土 ...

  9. SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

    SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...

随机推荐

  1. PHP stat() 函数 返回关于文件的信息。

    定义和用法 stat() 函数返回关于文件的信息. 语法 fstat(file) 参数 描述 file 必需.规定要检查的文件. 说明 获取由 file 指定的文件的统计信息.如果 file 是符号连 ...

  2. ectouch第九讲 之ectouch 开始调试模式方法

    ectouch 开始调试模式方法 原文: http://my.oschina.net/u/1036767/blog/407067页面报错对于发现编程过程中的问题很重要,所以在开发之前要先搞定它,免得出 ...

  3. Spring MVC 中请求返回之后的页面没法加载css、js等静态文件

    1.是否被拦截,这个在Web.xml配置中servlet拦截是“/”,如果是则 a.使用spring MVC 的静态资源文件 <!-- 静态文件访问,主要是针对DispatcherServlet ...

  4. 杭电1013-Digitai Root(另解)

    #include<stdio.h>#define maxsize 1000 int main(){    char N[maxsize+1];    int i,j,sum,n;    c ...

  5. YTU 2344: 先序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2344/2603.html 2344: 先序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 4  解决:  ...

  6. HDU 1402:A * B Problem Plus

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. Unity-Animator深入系列---测试CrossFade和CrossFadeInFixedTime

    回到 Animator深入系列总目录 CrossFade是按照动画的自身时间进行混合.如果动画10秒,混合持续时间0.2,会在2秒后混合完成 CrossFadeInFixedTime是按照实际时间进行 ...

  8. 用C#钩子写一个改键外挂

    我的微信群——软件开发测试工程师交流群,欢迎扫码: 改键是一种习惯,比如在玩儿lol或者dota的时候.理论上玩儿什么游戏都可以改键. 做一个窗体(点击Install——应用改键,点击Uninstal ...

  9. 自己模拟实现spring IOC原理

    1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对 ...

  10. P1119 灾后重建

    题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...