转 http://space.itpub.net/50897/viewspace-584304
1. shared SQL,parent cursor,child cursor 概念:
所有SQL都是Oracle暗式共享的(implicitly sharable)。当用户A发出一条SQL后,Oracle会根据SQL文本内容生成hash value(10g还有唯一的SQL_ID),以便能够快速找到 Shared pool已经存在的相同SQL。如果找不到,则Oracle会为这个SQL创建一个parent cursor和一个child cursor,这与SQL是否共享是没有关系的。
parent cursor包含了SQL TEXT和相关的hash value,v$sqlarea中的每一行代表了一个parent cursor,根据address表示了其内存地址。
child cursor包含了SQL的metadata,即使得这个SQL可以执行的所有相关信息,如OBJECT和权限,优化器设置,执行计划等。v$sql中中的每一行表示了一个child cursor,根据hash value和address与parent cursor 关联。child cursor有自己的address,即V$SQL.CHILD_ADDRESS。
第一个child cursor总是使用0来表示其创建顺序,V$SQL.CHILD_NUMBER = 0。因此,当从V$SQL_PLAN中查找某个SQL的执行计划时,要注意你写对了CHILD_NUMBER 。
如果有多个child cursor,则表示parent cursor有多个版本,v$sqlarea中的version_count字段就会纪录下来。
2. 如何确定SQL 是否可以共享:
假设用户A执行完一条SQL后,退出然后重新登陆,发出同一条SQL,则根据hash value找到Shared pool中已经存在的parent cursor,然后把 此parent cursor下的child cursor list搜寻一边,判断metadata是否完全相同,如果是,则这条sql可以共享,就完成了一次soft parse。
假设用户B之后发出一条SQL文本完全一样的SQL,但访问的table不是A用户的,而是B用户自己的,则metadata出现AUTH_CHECK_MISMATCH 和
TRANSLATION_MISMATCH ,无法共享child cursor。Oracle会因此在此parent cursor 下创建一个新的child cursor,也就是一个hard parse。
因此,SQL 是否可以共享是与parent cursor无关的,而是由child cursor决定的。
从v$sql_shared_cursor可以获得详细的无法共享的原因:
select * from v$sql_shared_cursor where kglhdpar = <parent address> --or sql_id = ''
select * from v$sql_shared_cursor where address = <parent address> --or sql_id = ''
一般常见的mismatch是:
OPTIMIZER_MISMATCH :优化器环境设置不同,一般是optimizer相关参数
BIND_MISMATCH : 绑定变量的值的长度在第二次执行的时候发生显著的变化 AUTH_CHECK_MISMATCH: 授权关系不匹配
TRANSLATION_MISMATCH: 事务环境不匹配
其实最常见的是 BIND_MISMATCH,在10g中可以测试一下:
create table t1(col1 varchar2(4000));
declare
v_col1 varchar2(4000);
begin
v_col1 := 't';
for i in 1..30 loop
v_col1 := v_col1 ||'t';
insert into t1 values(v_col1);
end loop;
end;
/
--可以看出,变量长度在30以下的时候,还是只有一个child cursor:
SQL_TEXT EXECUTIONS CHILD_NUMBER ADDRESS HASH_VALUE
--------------------------- ---------- ------------ -------- ----------
INSERT INTO T1 VALUES(:B1 ) 30 0 9E355F10 2351142747
declare
v_col1 varchar2(4000);
begin
v_col1 := 'tttttttttttttttttttttttttttttt';
for i in 31..4000 loop
v_col1 := v_col1 ||'t';
insert into t1 values(v_col1);
end loop;
end;
/
--可以看出,变量长度变化导致了四个child cursor 存在:
SQL_TEXT EXECUTIONS CHILD_NUMBER CHILD_ADDRESS ADDRESS HASH_VALUE
---------------------------- ---------- ------------ ------------- -------- ----------
INSERT INTO T1 VALUES(:B1 ) 32 0 9E355DCC 9E355F10 2351142747
INSERT INTO T1 VALUES(:B1 ) 96 1 9E34BA18 9E355F10 2351142747
INSERT INTO T1 VALUES(:B1 ) 1872 2 9E34B8D4 9E355F10 2351142747
INSERT INTO T1 VALUES(:B1 ) 2060 3 9E34B790 9E355F10 2351142747
分享到:
相关推荐
随着执行环境的变化,parent cursor会产生多个child cursor,每个新生成的child cursor都会在parent cursor中记录为一个version。`V$SQLAREA.VERSION_COUNT`列显示了所有生成过的child cursor的数量。如果child ...
通过查询发现,kglpnc:child和kglupc:child这两个函数上的sleep_count和wtr_slp_count值非常高,这两个函数分别对应了pin和unpin的数据库操作。这进一步证实了先前的观察,即Library cache中的SQLAREA对象在pin操作...
Open认证和Shared认证是两种常见的无线网络接入认证方式,它们主要用于确保只有授权的设备能够连接到无线网络,保护网络安全。以下是对这两种认证方式的详细解释。 Open认证,也称为开放系统认证,是一种相对简单的...
Laravel开发-shared Laravel框架。
AS3 SharedObject 是ActionScript 3中的一个关键组件,它允许在Flash应用程序中实现本地数据存储,特别是对于处理用户设置、游戏进度或者轻量级的数据持久化非常有用。本小例子将带你深入理解如何利用SharedObject...
Linux系统安装MySQL-shared-5.6.29-1.linux_glibc2.5.x86_64.rpm。
此外,`shared_ptr`还支持拷贝构造和赋值操作,拷贝或赋值时,所有`shared_ptr`实例都会共享同一个引用计数,这样可以确保只有在没有`shared_ptr`指向目标对象时才释放内存。 在C++中,`shared_ptr`通常用于替代...
maven-shared-utils-3.2.1.jar
"rw-shared"就是这样一款专为前端开发者设计的开源代码库,它旨在提供一系列可复用的组件和工具,以实现前端应用的高效共享与协作。 "rw-shared"库的核心目标是实现代码的共享,这通常意味着它包含了多个模块,这些...
### Poco C++扩展库中的SharedLibrary:动态链接库使用详解 #### SharedLibrary概述 现代操作系统平台大多提供了在运行时加载程序模块的功能,这些模块通常是以共享库(动态链接库)的形式存在。例如,在Windows...
"欢迎访问更多精彩.url"文件则是一个快捷方式,通常指向开发者或软件提供者的网站,用户可以通过这个链接获取更多关于软件的信息,比如更新、技术支持或者相关资源。这也是软件开发商与用户保持联系,提供持续服务的...
在给定的压缩包 "ffmpeg-shared-3.3.3-20160116-win64-shared.7z" 中,包含了FFmpeg 3.3.3版本的共享库(shared libraries),这是针对Windows 64位平台编译的。这个版本在Visual Studio 2015环境下已经过测试,可以...
Syncfusion.Shared.Wpf.dll
shared_ptr arm, use arm asm code
在这些情况下,使用SharedObject类就可以在本地进行数据存储和处理,无需搭建复杂的网络数据处理系统。 SharedObject类是Flash中用于数据处理的一个非常强大的类,它的功能类似于网页中的Cookie,可以以文件的形式...
在linux实现共享内存的创建、写入数据、读取数据
索尼笔记本Sony Shared Library是索尼开发的笔记本应用程序需要用到的一些dll,如果有丢失dll文件的,就下载吧。使用方法第一步先装好SSL然后重新启动,开始安装剩下的程序。安装顺序:Sony Shared Library nbsp;amp...
MySQL-server-5.1.26-0
进程间通信之共享内存 shared memory ) 1 效率最高 2 存在竞态 七种进程间通信方式: 一 无名管道( pipe ) 二 有名管道( fifo ) 三 共享内存 shared memory 四 信号 sinal 五 消息队列 message queue ) ...