【原创】删除plan_table表的奇怪问题

实验环境:WinXP SP2

数据库版本:10.2.0.1

今天在做实验的时候发现了一个奇怪的问题,大家可以先看看这个问题的表象:

查询的时候,plan_table没有任何问题

sys@TEST>select * from plan_table;

no rows selected

desc也没有任何问题

sys@TEST>desc plan_table
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ----------------
 STATEMENT_ID                                                   VARCHAR2(30)
 PLAN_ID                                                        NUMBER
 TIMESTAMP                                                      DATE
 REMARKS                                                        VARCHAR2(4000)
 OPERATION                                                      VARCHAR2(30)
 OPTIONS                                                        VARCHAR2(255)
 OBJECT_NODE                                                    VARCHAR2(128)
 OBJECT_OWNER                                                   VARCHAR2(30)
 OBJECT_NAME                                                    VARCHAR2(30)
 OBJECT_ALIAS                                                   VARCHAR2(65)
 OBJECT_INSTANCE                                                NUMBER(38)
 OBJECT_TYPE                                                    VARCHAR2(30)
 OPTIMIZER                                                      VARCHAR2(255)
 SEARCH_COLUMNS                                                 NUMBER
 ID                                                             NUMBER(38)
 PARENT_ID                                                      NUMBER(38)
 DEPTH                                                          NUMBER(38)
 POSITION                                                       NUMBER(38)
 COST                                                           NUMBER(38)
 CARDINALITY                                                    NUMBER(38)
 BYTES                                                          NUMBER(38)
 OTHER_TAG                                                      VARCHAR2(255)
 PARTITION_START                                                VARCHAR2(255)
 PARTITION_STOP                                                 VARCHAR2(255)
 PARTITION_ID                                                   NUMBER(38)
 OTHER                                                          LONG
 OTHER_XML                                                      CLOB
 DISTRIBUTION                                                   VARCHAR2(30)
 CPU_COST                                                       NUMBER(38)
 IO_COST                                                        NUMBER(38)
 TEMP_SPACE                                                     NUMBER(38)
 ACCESS_PREDICATES                                              VARCHAR2(4000)
 FILTER_PREDICATES                                              VARCHAR2(4000)
 PROJECTION                                                     VARCHAR2(4000)
 TIME                                                           NUMBER(38)
 QBLOCK_NAME                                                    VARCHAR2(30)

但是在drop时,会说找不到plan_table表了

sys@TEST>drop table plan_table;
drop table plan_table
           *
ERROR at line 1:
ORA-00942: table or view does not exist

而且在数据字典中也查不到plan_table表了

sys@TEST>select table_name from dba_tables where table_name='PLAN_TABLE';

no rows selected

产生这个问题的实验步骤如下:

在第一个会话中:

sys@TEST>set autotrace trace explain
sys@TEST>select * from dual;

Execution Plan
----------------------------------------------------------
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 |
--------------------------------------------------------------------------

在第二个会话中:

sys@TEST>set autotrace trace explain
sys@TEST>select * from dual;

Execution Plan
----------------------------------------------------------
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 |
--------------------------------------------------------------------------

然后在第二个会话中删除plan_table表

sys@TEST>drop table plan_table;

Table dropped.

通过查询执行计划,发现实际上在这种情况下(plan_table已经被删除,但有些会话还在进行autotrace操作),Oracle会自动将plan_table作为数据字典表plan_table$的同义词(绿色的部分)

sys@TEST>select * from plan_table;

Execution Plan
----------------------------------------------------------
Plan hash value: 103984305

---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |     1 | 11081 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| PLAN_TABLE$ |     1 | 11081 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------

根据这个实验和http://space.itpub.net/498744/viewspace-264996中的实验,总结如下:

1、当前会话可以删除plan_table表(不论是否执行了autotrace操作)

2、如果有会话在执行autotrace操作,其他会话在没有执行autotrace操作的时候,是不能删除plan_table表的(plan_table被锁定)

3、如果有会话在执行autotrace操作,其他会话在执行autotrace操作的时候,可以删除plan_table表,其他正在执行autotrace操作的会话会自动使用plan_table$数据字典表

4、10g已经可以不用建立plan_table表了,会自动使用plan_table$数据字典表

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/498744/viewspace-264997/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/498744/viewspace-264997/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值