细致入微:Oracle中执行计划在Shared Pool中的存储位置探秘

这两天我一直在想一个问题,那就是 Oracle 的执行计划到底存储在什么地儿?它会是一种什么样的格式?

这里我试图对这个问题做一点我自己认为的解释,这个解释可能是有问题的。

朋友们在看这篇文章之前,应该首先熟悉如下的这张图:

怎样才叫熟悉这张图呢?我认为验证的方法就是看你是否能够仅仅看着这张图,在1个小时的时间内把这张图的内容解释清楚。

这张图也许能够用来衡量你对 library cache 的了解程度。

我们现在做的测试其实就来源于上面这张图:

首先执行一下下述的 sql:

SQL_testdb>select * from scott.emp;

接着查一下上述 sql 在 library cache中的library cache object handle 的地址,一下两种方式都可以获取 SQL 语句父游标地址:

SQL_testdb>select address,sql_text from v$sqlarea where sql_text like ‘select * from scott.emp%’;

然后我们 dump 一下 library cache,注意这里level一定要大于等于8,否则看不到heap 0的内容:

SQL_testdb>alter session set events ‘immediate trace name library_cache level 11’; Session altered. SQL_testdb>oradebug setmypid Statement processed. SQL_testdb>oradebug tracefile_name /cadrasu01/app/oracle/admin/testdb/udump/testdb_ora_4128918.trc

从上述trace文件中我们以 070000001CAE2C70 为关键字去查询,查询结果如下:

注意看上述 library cache object 的类型是 cursor,名字是 select * from scott.emp,它有一个子 cursor,其 library cache object handle 的地址是 70000001cae15e0。我们现在就以这个地址继续搜索上述 trace 文件,搜到的内容如下:

从上述内容中我们可以看到,子 cursor 是没有名字的,这个其实很正常——因为 Oracle 是通过先访问其 parent cursor 后才会来访问它。

另外,这个子 cursor 只有两个 data block,分别是 data block 0 和 data block 6,对应的就是上图中的 heap 0 和 heap 6。

我首先排除掉 heap 0,理由如下:

The data block structure for a heap, stored in heap 0, contains a pointer to the first data block that is allocated for the heap, a status indicator, the pin under which the heap is loaded, and so on.

那么剩下的就只有一种可能,就是 Oracle 把 sql 的执行计划存储在了 heap 6里。

接下来我们 dump一下 heap 6 的内容:

SQL_testdb>oradebug setmypid Statement processed. SQL_testdb>alter session set events ‘immediate trace name heapdump_addr level 2, addr0x70000001cae1328′; Session altered. SQL_testdb>oradebug tracefile_name /cadrasu01/app/oracle/admin/testdb/udump/testdb_ora_2859106.trc

从上述 trace文件中我们可以看到如下的内容:

上述 trace 文件的内容告诉我们 heap 6 实际上就是 sql area(这个和上图中描述的 heap 6是 sql context 不尽相同),剩下的内容除了我们能看出包含了表 scott.emp 的各个字段的内容之外,其他的就看不懂了。

我猜测 Oracle 把 sql 的执行计划存在了这个 sql 的子 cursor 的 heap 6(也就是 sql area)中,只不过存储的形式是编译好的二进制格式。

感谢 MOS,让我找到了如下的论据,可以在某种程度上让我自圆其说:

Parsing a cursor builds four different library cache structures, if they do not already exist, within the library cache: 1、parent cursor handle 2、parent cursor object, containing the child dependency list 3、child cursor handle, inserted in the child dependency list of the parent object 4、child cursor object, containing the compilation and run-time execution plan for the compiled SQL statement.

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏搜云库

Spring Boot 中使用 RabbitMQ

一、什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器...

2189
来自专栏沃趣科技

sysbench的lua小改动导致的性能差异

最近在配合某同事做一项性能压测,发现相同数据量、相同数据库参数、相同sysbench压力、相同数据库版本和sysbench版本、相同服务器硬件环境下,我和同事的...

1173
来自专栏杨建荣的学习笔记

海量数据迁移之传输表空间(一) (r5笔记第71天)

在自己接触的很多的数据迁移工作中,使用外部表在一定程度上达到了系统的预期,对于增量,批量的数据迁移效果还是不错的,但是也不能停步不前,在很多限定的场景中,有很多...

2317
来自专栏数据和云

使用 Direct Initial Load 初始化 GoldenGate 同步数据

作者简介 ? 桑凯 现任职于云和恩墨,具有多年 Oracle 数据库企业级运维经验,擅长容灾项目解决方案设计,作为项目经理负责多个基于 Oracle DataG...

3255
来自专栏Debian社区

Postgres 10 开发者新特性

目前非常流行的RDBMS PostgresSQL已经在几周前发布了它的第10个版本。由于Postgres的可靠性、节约成本、成熟,当然还有它的开源,已经21岁的...

872
来自专栏文渊之博

关于tempdb的一些注意事项

    由于数据库的文件的位置对于I/O性能如此重要,以至于在创建主数据文件的文职时,需要考虑tempdb性能对系统性的影响,因为它是最动态的数据库,速度还需要...

2066
来自专栏沃趣科技

Oracle Real Time SQL Monitoring

术语说明 TableQueue,消息缓冲区,在并行操作中使用,用于PX进程之间的通信,或者PX进程与QC进程之间的通信,是内存中的一些page,每个消息缓冲区的...

4398
来自专栏沃趣科技

初相识 | 全方位认识 sys 系统库

前阵子,我们的"全方位认识performance_schema"系列为大家完整的介绍了performance_schema系统库。在我们的发布计划中为什么要把p...

1873
来自专栏数据和云

盘点 Oracle 11g 中新特性带来的10大性能影响

Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先引起的是一些麻烦,因为对于新技术的不了解、因为对于旧环境的不适应...

4074
来自专栏文渊之博

参数化(一):计划缓存

  简介   很多时候,当我执行查询调优的时候,引发查询性能糟糕的问题一般都是与参数化相关的。一方面,参数化是查询处理器核心的基本主题。它能显著影响查询性能。另...

1748

扫码关注云+社区