最近遇到了错误“Error: cannot fetch last explain plan from PLAN_TABLE”,于是稍微研究了一下哪些场景下碰到这种错误,具体参考下面案例:

1:忘记使用EXPLAIN PLAN放在SQL语句前面,然后使用使用SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)查看具体SQL的执行计划时,就会遇到错误“Error: cannot fetch last explain plan from PLAN_TABLE”。如下所示:

SQL> show user;

USER is "SYS"

SQL> SELECT *

  2  FROM SCOTT.EMP

  3  WHERE HIREDATE BETWEEN '01-JAN-1981' AND '01-APR-1981';

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

 

SQL> COL PLAN_TABLE_OUTPUT FOR A180;

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

 

PLAN_TABLE_OUTPUT

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

Error: cannot fetch last explain plan from PLAN_TABLE

其实,这种情形是因为SQL语句中忘记使用EXPLAIN PLAN,一般而言EXPLAIN PLAN会将SQL对应的执行计划放入plan_table。官方文档介绍如下:

The EXPLAIN PLAN statement displays execution plans chosen by the Oracle optimizer for SELECT, UPDATE, INSERT, and DELETE statements. A statement's execution plan is the sequence of operations Oracle performs to run the statement. The row source tree is the core of the execution plan.

如果没有使用EXPLAIN PLAN,那么没有将对应SQL的执行计划放进PLAN_TABLE,而如果使用EXPLAIN PLAN,那么ORACLE会用格式化的数据填充PLAN_TABLE表,以便以易读的格式呈现给用户。个人使用10046跟踪对比了一下(对比使用EXPLAIN PLAN和不使用EXPLAIN PLAN两种情况),使用EXPLAIN PLAN时,数据库会向plan_table插入数据。如下所示:

2:对应的用户下存在PLAN_TABLE表(这个可能情况比较复杂),然后使用ALTER SESSION SET CURRENT_SCHEMA设置当前会话的SCHEMA时可能会遇到这种场景。

在SCOTT用户下创建一个PLAN_TABLE(结构一样,如果结构不一样,会报另外一种错误)

SQL> SHOW USER; 

USER is "SCOTT"

SQL>CREATE TABLE PLAN_TABLE AS 

  SELECT STATEMENT_ID, 

         PLAN_ID, 

         TIMESTAMP, 

         REMARKS, 

         OPERATION, 

         OPTIONS, 

         OBJECT_NODE, 

         OBJECT_OWNER, 

         OBJECT_NAME, 

         OBJECT_ALIAS, 

         OBJECT_INSTANCE, 

         OBJECT_TYPE, 

         OPTIMIZER, 

         SEARCH_COLUMNS, 

         ID, 

         PARENT_ID, 

         DEPTH, 

         POSITION, 

         COST, 

         CARDINALITY, 

         BYTES, 

         OTHER_TAG, 

         PARTITION_START, 

         PARTITION_STOP, 

         PARTITION_ID, 

         TO_LOB(OTHER) AS OTHER, 

         OTHER_XML     AS OTHER_XML, 

         DISTRIBUTION, 

         CPU_COST, 

         IO_COST, 

         TEMP_SPACE, 

         ACCESS_PREDICATES, 

         FILTER_PREDICATES, 

         PROJECTION, 

         TIME, 

         QBLOCK_NAME 

  FROM   PLAN_TABLE;

SQL> EXPLAIN PLAN FOR

  2  SELECT * FROM DUAL;

 

Explained.

 

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); #SCOTT用户下不会出错。

 

PLAN_TABLE_OUTPUT

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

Plan hash value: 272002086

 

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

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |

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

8 rows selected.

 

SQL> 

但是我们使用ALTER SESSION SET CURRENT_SCHEMA设置当前会话的SCHEMA后,那么再按之前的SQL测试,就会遇到这个错误,如下所示:

SQL> show user;

USER is "SYS"

SQL> alter session set current_schema=SCOTT;

 

Session altered.

 

SQL> EXPLAIN PLAN FOR

  2  SELECT *

  3  FROM SCOTT.EMP

WHERE HIREDATE BETWEEN '01-JAN-1981' AND '01-APR-1981';  4  

 

Explained.

 

SQL> COL PLAN_TABLE_OUTPUT FOR A180;

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

 

PLAN_TABLE_OUTPUT

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

Error: cannot fetch last explain plan from PLAN_TABLE

 

 

SQL> SET LINESIZE 1200

SQL> SELECT OWNER,OBJECT_NAME,OBJECT_TYPE,CREATED FROM ALL_OBJECTS 

  2  WHERE OBJECT_NAME LIKE 'PLAN_TABLE%' 

  3  AND OWNER IN (SYS_CONTEXT('USERENV','CURRENT_SCHEMA'),'PUBLIC','SYS');

 

OWNER                          OBJECT_NAME                    OBJECT_TYPE         CREATED

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

SYS                            PLAN_TABLE$                    TABLE               24-MAY-15

PUBLIC                         PLAN_TABLE                     SYNONYM             30-JUN-05

SCOTT                          PLAN_TABLE                     TABLE               21-DEC-19

如果遇到这种情况,可以使用上面脚本看看是否存在同名的PLAN_TABLE,这种情况下,可以将SCOTT下的PLAN_TABLE表重命名或删除即可。当然也可以用下面方法

SQL> EXPLAIN PLAN INTO SCOTT.PLAN_TABLE FOR

  2  SELECT *

  3  FROM SCOTT.EMP

WHERE HIREDATE BETWEEN '01-JAN-1981' AND '01-APR-1981';

Explained.

 

SQL> COL PLAN_TABLE_OUTPUT FOR A180;

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

 

PLAN_TABLE_OUTPUT

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

Plan hash value: 3956160932

 

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

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |      |     2 |    74 |     2   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| EMP  |     2 |    74 |     2   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

PLAN_TABLE_OUTPUT

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

   1 - filter("HIREDATE"<=TO_DATE(' 1981-04-01 00:00:00', 'syyyy-mm-dd

              hh24:mi:ss') AND "HIREDATE">=TO_DATE(' 1981-01-01 00:00:00',

              'syyyy-mm-dd hh24:mi:ss'))

 

15 rows selected.

 

SQL> 

当然,还可以更深入的探究,只是没有太多价值,而且个人在测试过程中,发现还有许多其它状况,例如解决了这个错误后,再去测试,就发现不报错。但是显示的执行计划还是原来SQL(不是当前SQL的执行计划)......... 。当然也不排除还有一些场景可能遇到这个错误。这里仅仅描述了两种场景。

Error: cannot fetch last explain plan from PLAN_TABLE的更多相关文章

  1. Oracle 执行计划(Explain Plan)

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...

  2. 优化器的使用oracle ---explain plan

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...

  3. 转:Oracle 执行计划(Explain Plan) 说明

    Oracle 执行计划(Explain Plan) 说明 原贴地址:http://blog.csdn.net/tianlesoftware/article/details/5827245   如果要分 ...

  4. 【转】Oracle 执行计划(Explain Plan) 说明

    转自:http://blog.chinaunix.net/uid-21187846-id-3022916.html       如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQ ...

  5. EXPLAIN PLAN获取SQL语句执行计划

    一.获取SQL语句执行计划的方式 1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划 2. 启用执行计划跟踪功能,即autotrace功能 3 ...

  6. Oracle执行计划 explain plan

    Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...

  7. Oracle Explain Plan,hint解释与示例

    Oracle 专业dba博客:http://blog.csdn.net/tianlesoftware Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响S ...

  8. SQL Tuning 基础概述02 - Explain plan的使用

    1.explain plan的使用 SQL> explain plan for delete from t_jingyu; Explained. SQL> select * from ta ...

  9. 分析oracle的执行计划(explain plan)并对对sql进行优化实践

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

随机推荐

  1. ARTS Week 3

    Nov 11,2019 ~ Nov 17,2019 Algorithm 本周来介绍快速求一个数字n次方的余数. 理论基础 我们先定义运算$ x \bmod p = r \(与\) x \equiv r ...

  2. SpringBoot学习笔记 文件访问映射

    通过SpringBoot可以把磁盘内所有的文件都访问到 有一张图片存放在 E://images/acti/123.jpg import org.springframework.context.anno ...

  3. Asp.Net Core IdentityServer4 管理面板集成

    前言 IdentityServer4(以下简称 Id4) 是 Asp.Net Core 中一个非常流行的 OpenId Connect 和 OAuth 2.0 框架,可以轻松集成到 Asp.Net C ...

  4. Go语言实现:【剑指offer】树的子结构

    该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode stru ...

  5. 基于MySQL+MHA+Haproxy部署高可用负载均衡集群

    一.MHA 概述 MHA(Master High Availability)是可以在MySQL上使用的一套高可用方案.所编写的语言为Perl 从名字上我们可以看到.MHA的目的就是为了维护Master ...

  6. 20200118--python学习第十一天

    今日内容 函数小高级 lambda表达式 内置函数 内容回顾 1.函数基本结构 2.参数 形参 基本参数:def func(a1,a2):pass 默认值:def func(a1,a2=123):pa ...

  7. 学习Sparql

    一 . gstore--一种开源图数据库系统 https://www.docin.com/p-1951514687.html 二 . 使用 SPARQL 查询 RDF 数据 https://www.i ...

  8. ubuntu 14.04 下安装 selenium 2.0

    文章参考出处:http://blog.sina.com.cn/s/blog_5042ea610102we4y.html 1.安装 python-pip sudo apt-get install pyt ...

  9. 【转】关于apt源配置的问题

    涉及的基本配置文件: apt核心配置文件集中在 /etc/apt 其中,管理软件来源的配置文件如下 sources.list                           // 主要软件源 so ...

  10. OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Out of memory' (errno=12)

    使用docker 安装kafka时启动失败 查看报错日志 # docker logs --since 30m 71846a96e514 Excluding KAFKA_HOME from broker ...