creatdep oracle_SYS_TEMP_ 临时表的生成与Oracle内部操作

本文介绍了Oracle数据库中以SYS_TEMP_开头的临时表的生成原因及其在执行WITH语句等操作时的作用。通过执行计划和10046事件追踪,展示了SQL执行过程中如何产生并使用这些临时对象,帮助理解Oracle的内部工作原理。
摘要由CSDN通过智能技术生成

SYS_TEMP_ 临时表的生成与Oracle内部操作

今天有网友问道一个问题,Oracle数据库里发现有一个莫名其妙的临时表,以SYS_TEMP_ 开头,但是不知道是做什么的,也找不到具体的SQL。

我提示:可以通过执行计划去反查SQL,这样就可以从视图中找到相关的SQL语句。

果然,SQL被如此找到。那么这些临时对象是如何产生,其用途又何在呢?

在Oracle数据库中,很多SQL在执行的过程中,都可能产生中间的过程对象,在执行之后会被清理删除,如果你不了解这些内部操作,可能就会发现比较奇怪的对象。看如下测试。

建立一个测试表,执行一个WITH语句查询,中间实体化的过程就引入临时表,这些可以从执行计划中看到:

SQL> connect eygle/eygle@enmo

Connected.

SQL> create table t as select * from dba_objects;

Table created.

SQL> set linesize 150

SQL> set autotrace traceonly

SQL> with t1 as (select count(*) from t) select * from t1 t11, t1 t12;

Execution Plan

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

Plan hash value: 3178380639

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

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

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

|   0 | SELECT STATEMENT       |                   |     1 |    26 |   429     (1)| 00:00:01 |

|   1 |  TEMP TABLE TRANSFORMATION |                   |       |       |        |           |

|   2 |   LOAD AS SELECT       | SYS_TEMP_0FD9D6697_3729F2 |       |       |        |           |

|   3 |    SORT AGGREGATE       |                   |     1 |       |        |           |

|   4 |     TABLE ACCESS FULL       | T                   | 90776 |       |   425     (1)| 00:00:01 |

|   5 |   MERGE JOIN CARTESIAN       |                   |     1 |    26 |     4     (0)| 00:00:01 |

|   6 |    VIEW            |                   |     1 |    13 |     2     (0)| 00:00:01 |

|   7 |     TABLE ACCESS FULL       | SYS_TEMP_0FD9D6697_3729F2 |     1 |    13 |     2     (0)| 00:00:01 |

|   8 |    BUFFER SORT           |                   |     1 |    13 |     4     (0)| 00:00:01 |

|   9 |     VIEW           |                   |     1 |    13 |     2     (0)| 00:00:01 |

|  10 |      TABLE ACCESS FULL       | SYS_TEMP_0FD9D6697_3729F2 |     1 |    13 |     2     (0)| 00:00:01 |

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

Statistics

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

42  recursive calls

8  db block gets

1549  consistent gets

1526  physical reads

668  redo size

619  bytes sent via SQL*Net to client

543  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

1  sorts (memory)

0  sorts (disk)

1  rows processed

通过10046事件,可以跟踪一下SQL的执行过程:

SQL> set autotrace off

SQL> alter session set events '10046 trace name context forever,level 12';

Session altered.

SQL> with t1 as (select count(*) from t) select * from t1 t11, t1 t12;

COUNT(*)   COUNT(*)

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

90776    90776

SQL> show parameter dump

NAME                     TYPE     VALUE

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

background_core_dump             string     partial

background_dump_dest             string     /u01/app/oracle/diag/rdbms/mom

o/momo/trace

core_dump_dest                 string     /u01/app/oracle/diag/rdbms/mom

o/momo/cdump

max_dump_file_size             string     unlimited

sh

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值