- 浏览: 1429525 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (363)
- oracle (43)
- 缓存策略 (4)
- 数据库设计 (7)
- IntelliJ IDEA (8)
- freemarker (3)
- JSP (12)
- java基础 (75)
- tomcat (14)
- 服务器 (10)
- maven (3)
- linux (21)
- e-learning (2)
- 手机开发 (1)
- 设计模式 (6)
- 技术之外 (2)
- 工具的使用 (8)
- HTML 5 (5)
- 网站前台 (38)
- 网站后台 (11)
- 项目管理 (12)
- 面试题 (5)
- 幽默 (0)
- 系统架构 (8)
- 创业 (10)
- div-css (5)
- 诗词歌赋 (1)
- 网络课堂组知识库 (4)
- 杂家 (3)
- android (12)
- 框架 (14)
- 读书笔记 (1)
- 孙子兵法 (1)
- mysql (3)
- 小人书 (0)
- Jquery (6)
- eclipse (2)
- 正则表达式 (1)
最新评论
-
a98709474:
写的很详细,看完了,明白了这种概念了
数据库水平切分(拆库拆表)的实现原理解析(转) -
a98709474:
MYSQL分库分表总结 -
CatchU:
7年前的招聘要求,厉害厉害
面试要求 -
luozhixiong:
<table class="bbcode&qu ...
MYSQL分库分表总结 -
沈寅麟:
好用
freemarker格式化
游标是数据库领域较为复杂的一个概念,因为游标包含了shared cursor和session cursor。两者有其不同的概念,也有不同的表现形式。 共享游标的概念易于与SQL语句中定义的游标相混淆。本文主要描述解析过程中的父游标,子游标以及共享游标,即shared cursor,同时给出了 游标(session cursor)的生命周期以及游标的解析过程的描述。
相关概念:游标的定义,声明;硬解析与软解析;
一、相关定义
shared cursor
也即是共享游标,是SQL语句在游标解析阶段生成获得的,是位于library cache中的sql或匿名的pl/sql等。其元数据被在视图V$sqlarea 与v$sql中具体化。如果library cache中的父游标与子游标能够被共享,此时则为共享游标。父游标能够共享即为共享的父游标,子游 标能够共享极为共享的子游标。
session cursor
即通过系统为用户分配缓冲区用于存放SQL语句的执行结果。用户可以通过这个中间缓冲区逐条取出游标中的记录并对其处理,直到所 有的游标记录被逐一处理完毕。session cursor指的跟这个session相对应的server process的PGA里(准确的说是UGA)的一块内存区域 (或者说内存结构)即其主要特性表现在记录的逐条定位,逐条处理。session cursor的元数据通过v$open_ cursor视图来具体化。每一 个打开或解析的SQL都将位于该视图。
二、游标的生命周期(session cursor)
session cursor需要从UGA中分配内存,因此有其生命周期。其生命周期主要包括:
打开游标(根据游标声明的名称在UGA中分配内存区域)
解析游标(将SQL语句与游标关联,并将其执行计划加载到library cache)
定义输出变量(仅当游标返回数据时)
绑定输入变量(如果与游标关联的SQL语句使用了绑定变量)
执行游标(即执行SQL语句)
获取游标(即获取SQL语句记录结果,根据需要对记录作相应操作。游标将逐条取出查询的记录,直到取完所有记录)
关闭游标(释放UGA中该游标占有的相关资源,但library cache中的游标的执行计划按LRU原则清除,为其游标共享提供可能性)
对于session cursor而言,可以将游标理解为任意的DML,DQL语句(个人理解,有待核实)。即一条SQL语句实际上就是一个游标,只不过 session cursor分为显示游标和隐式游标,以及游标指针。由上面游标的生命周期可知,任何的游标(SQL语句)都必须经历内存分配,解析, 执行与关闭的过程。故对隐式游标而言,生命周期的所有过程由系统来自动完成。对所有的DML和单行查询(select...into...)而言, 系统自动使用隐式游标。多行结果集的DQL则通常使用显示游标。
二、游标的解析过程(产生shared cursor)
解析过程:
A、包含vpd的约束条件:
SQL语句如果使用的表使用了行级安全控制,安全策略生成的约束条件添加到where子句中
B、语法、语义、访问权限检查:
检查SQL语句书写的正确性,对象存在性,用户的访问权限
C、父游标缓存:
将该游标(SQL语句)的文本进行哈希得到哈希值并在library cache寻找相同的哈希值,如不存在则生存父游标且保存在library cache 中,按顺序完成D-F步骤。如果此时存在父游标,则进一步判断是否存在子游标。若存在相同的子游标,则直接调用其子游标的执行计 划执行该SQL语句,否则转到步骤D进行逻辑优化
即:父游标对应Sql文本 , 子游标对应执行计划
D、逻辑优化:
使用不同的转换技巧,生成语义上等同的新的SQL语句(SQL语句的改写),一旦该操作完成,则执行计划数量、搜索空间将会相应增长。 其主要目的未进行转换的情况下是寻找无法被考虑到的执行计划
E、物理优化:
为逻辑优化阶段的SQL语句产生执行计划,读取数据字典中的统计信息以及动态采样的统计信息,计算开销,开销最低的执行计划将被 选中。CBO
F、子游标缓存:
分配内存,生成子游标(即最佳执行计划),与父游标关联。可以在v$sqlarea,v$sql得到具体游标信息,父子游标通过sql_id关联
对于仅仅完成步骤A与B的SQL语句即为软解析,否则即为硬解析
三、shared cursor与session cursor的关系以及软软解析关系:
一个session cursor只能对应一个shared cursor,而一个shared cursor却可能同时对应多个session cursor
四、父游标与子游标、共享游标
由游标的解析过程可知,父游标,子游标同属于共享游标的范畴。
父游标
是在进行硬解析时产生的,父游标里主要包含两种信息:SQL文本以及优化目标(optimizergoal),首次打开父游标被锁定,直到其他 所有的session都关闭该游标后才被解锁。当父游标被锁定的时候是不能被LRU算法置换出library cache,只有在解锁以后才能置换出 library cache,此时该父游标对应的所有子游标也同样被置换出library cache。v$sqlarea中的每一行代表了一个parent cursor, address表示其内存地址。
子游标
当发生硬解析时,在产生父游标的同时,则跟随父游标会产生相应的子游标,此时V$SQL.CHILD_NUMBER的值为0。 如果存在父游标,由于不同的运行环境,此时同样会产生新的子游标,新子游标的CHILD_NUMBER在已有子游标基础上以1为单位累计。 子游标包括游标所有相关信息,如具体的执行计划、绑定变量,OBJECT和权限,优化器设置等。子游标随时可以被LRU算法置换出 library cache,当子游标被置换出library cache时,oracle可以利用父游标的信息重新构建出一个子游标来,这个过程叫reload。 v$sql中中的每一行表示了一个child cursor,根据hashvalue和address与parent cursor关联。 child cursor有自己的address,即v$sql.child_address。 确定一个游标的三个主要字段:address,hash_value,child_number,
五、总结
1、硬解析通常是由于不可共享的父游标造成的,如经常变动的SQL语句,或动态SQL或未使用绑定变量等
2、解决硬解析的办法则通常是使用绑定变量来解决
3、与父游标SQL文本完全一致的情形下,多个相同的SQL语句可以共享一个父游标
4、SQL文本、执行环境完全一致的情形下,子游标能够被共享,否则如果执行环境不一致则生成新的子游标
相关概念:游标的定义,声明;硬解析与软解析;
一、相关定义
shared cursor
也即是共享游标,是SQL语句在游标解析阶段生成获得的,是位于library cache中的sql或匿名的pl/sql等。其元数据被在视图V$sqlarea 与v$sql中具体化。如果library cache中的父游标与子游标能够被共享,此时则为共享游标。父游标能够共享即为共享的父游标,子游 标能够共享极为共享的子游标。
session cursor
即通过系统为用户分配缓冲区用于存放SQL语句的执行结果。用户可以通过这个中间缓冲区逐条取出游标中的记录并对其处理,直到所 有的游标记录被逐一处理完毕。session cursor指的跟这个session相对应的server process的PGA里(准确的说是UGA)的一块内存区域 (或者说内存结构)即其主要特性表现在记录的逐条定位,逐条处理。session cursor的元数据通过v$open_ cursor视图来具体化。每一 个打开或解析的SQL都将位于该视图。
二、游标的生命周期(session cursor)
session cursor需要从UGA中分配内存,因此有其生命周期。其生命周期主要包括:
打开游标(根据游标声明的名称在UGA中分配内存区域)
解析游标(将SQL语句与游标关联,并将其执行计划加载到library cache)
定义输出变量(仅当游标返回数据时)
绑定输入变量(如果与游标关联的SQL语句使用了绑定变量)
执行游标(即执行SQL语句)
获取游标(即获取SQL语句记录结果,根据需要对记录作相应操作。游标将逐条取出查询的记录,直到取完所有记录)
关闭游标(释放UGA中该游标占有的相关资源,但library cache中的游标的执行计划按LRU原则清除,为其游标共享提供可能性)
对于session cursor而言,可以将游标理解为任意的DML,DQL语句(个人理解,有待核实)。即一条SQL语句实际上就是一个游标,只不过 session cursor分为显示游标和隐式游标,以及游标指针。由上面游标的生命周期可知,任何的游标(SQL语句)都必须经历内存分配,解析, 执行与关闭的过程。故对隐式游标而言,生命周期的所有过程由系统来自动完成。对所有的DML和单行查询(select...into...)而言, 系统自动使用隐式游标。多行结果集的DQL则通常使用显示游标。
二、游标的解析过程(产生shared cursor)
解析过程:
A、包含vpd的约束条件:
SQL语句如果使用的表使用了行级安全控制,安全策略生成的约束条件添加到where子句中
B、语法、语义、访问权限检查:
检查SQL语句书写的正确性,对象存在性,用户的访问权限
C、父游标缓存:
将该游标(SQL语句)的文本进行哈希得到哈希值并在library cache寻找相同的哈希值,如不存在则生存父游标且保存在library cache 中,按顺序完成D-F步骤。如果此时存在父游标,则进一步判断是否存在子游标。若存在相同的子游标,则直接调用其子游标的执行计 划执行该SQL语句,否则转到步骤D进行逻辑优化
即:父游标对应Sql文本 , 子游标对应执行计划
D、逻辑优化:
使用不同的转换技巧,生成语义上等同的新的SQL语句(SQL语句的改写),一旦该操作完成,则执行计划数量、搜索空间将会相应增长。 其主要目的未进行转换的情况下是寻找无法被考虑到的执行计划
E、物理优化:
为逻辑优化阶段的SQL语句产生执行计划,读取数据字典中的统计信息以及动态采样的统计信息,计算开销,开销最低的执行计划将被 选中。CBO
F、子游标缓存:
分配内存,生成子游标(即最佳执行计划),与父游标关联。可以在v$sqlarea,v$sql得到具体游标信息,父子游标通过sql_id关联
对于仅仅完成步骤A与B的SQL语句即为软解析,否则即为硬解析
三、shared cursor与session cursor的关系以及软软解析关系:
一个session cursor只能对应一个shared cursor,而一个shared cursor却可能同时对应多个session cursor
四、父游标与子游标、共享游标
由游标的解析过程可知,父游标,子游标同属于共享游标的范畴。
父游标
是在进行硬解析时产生的,父游标里主要包含两种信息:SQL文本以及优化目标(optimizergoal),首次打开父游标被锁定,直到其他 所有的session都关闭该游标后才被解锁。当父游标被锁定的时候是不能被LRU算法置换出library cache,只有在解锁以后才能置换出 library cache,此时该父游标对应的所有子游标也同样被置换出library cache。v$sqlarea中的每一行代表了一个parent cursor, address表示其内存地址。
子游标
当发生硬解析时,在产生父游标的同时,则跟随父游标会产生相应的子游标,此时V$SQL.CHILD_NUMBER的值为0。 如果存在父游标,由于不同的运行环境,此时同样会产生新的子游标,新子游标的CHILD_NUMBER在已有子游标基础上以1为单位累计。 子游标包括游标所有相关信息,如具体的执行计划、绑定变量,OBJECT和权限,优化器设置等。子游标随时可以被LRU算法置换出 library cache,当子游标被置换出library cache时,oracle可以利用父游标的信息重新构建出一个子游标来,这个过程叫reload。 v$sql中中的每一行表示了一个child cursor,根据hashvalue和address与parent cursor关联。 child cursor有自己的address,即v$sql.child_address。 确定一个游标的三个主要字段:address,hash_value,child_number,
五、总结
1、硬解析通常是由于不可共享的父游标造成的,如经常变动的SQL语句,或动态SQL或未使用绑定变量等
2、解决硬解析的办法则通常是使用绑定变量来解决
3、与父游标SQL文本完全一致的情形下,多个相同的SQL语句可以共享一个父游标
4、SQL文本、执行环境完全一致的情形下,子游标能够被共享,否则如果执行环境不一致则生成新的子游标
发表评论
-
一对多关系中,查没儿子的记录语句
2014-09-04 12:05 974SELECT B.* FROM tbl_mall_orde ... -
关于数据库反向索引
2014-03-24 14:24 1052反向索引与平时的常用索引不同的是,它将要增加索引的列的数据按字 ... -
常用SQL
2013-05-07 11:29 1216select to_date('2013-04-17 13:2 ... -
oracle重建索引
2012-10-20 17:39 1065alter index SYS_C0010453 rebu ... -
数据库无法启动问题
2012-09-12 09:55 1145登录数据库时提示:ORA-12514: TNS: 监听程序当前 ... -
group + decode
2012-09-07 16:07 978SELECT G.PO_ID, G.PROD_ ... -
两个日期相差几天
2012-09-05 22:33 1185SELECT trunc(sysdate-TO_date('2 ... -
复制一行记录 insert into select
2012-09-04 16:38 1348insert into tb_sys_menu (men ... -
最好的分页
2012-07-19 23:00 976select t2.prod_id, t2.prod_name ... -
Druid 德鲁依
2012-03-21 14:22 1070Druid是一个JDBC组件,它包括三部分: DruidD ... -
ORACLE user_objects 表
2012-03-09 13:36 68861. OBJECT_TYPE select distinct( ... -
oracle net manager
2011-12-03 08:25 947url="jdbc:oracle:thin:@192 ... -
数据库视图的优点
2011-11-22 13:06 1184限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽创建视 ... -
悲观锁与乐观锁
2011-10-18 14:05 982... -
pl /sql导入表结构或者数据
2011-09-22 14:03 1370导出表结构: Tools-->Export User ... -
查询重复记录
2011-09-21 12:06 542select * from order_ticket ot W ... -
数据库有哪些缓存策略?
2011-09-01 15:03 19121:Query Cache 以SQL作为key值缓存查询 ... -
Oracle instr函数
2011-08-24 15:49 1145在Oracle中,可以使用instr函数对某个字符串进行判断, ... -
ORACLE的sign函数 和 DECODE函数
2011-08-24 15:00 42321:比较大小函数 SIGN sign()函数根据某个值是0 ... -
JAVA连接各种数据库
2011-07-27 09:06 9141、Oracle 数据库(thin模式) Class. ...
相关推荐
oracle视频教程(游标、子程序、包) oracle视频教程(游标、子程序、包)
Oracle 游标使用方法及语法大全 Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动...
游标卡尺是一种精密的测量工具,广泛应用于工程、制造业以及物理实验中,用于测量工件的内外径、深度和宽度等尺寸。本教学设计旨在帮助学习者掌握游标卡尺的基本操作方法和准确读数的技巧。 首先,我们要了解游标...
在高并发、高处理量的系统中,绝对的游标共享也可能引起性能瓶颈。 4. 绑定变量 绑定变量是一种软解析技术,可以实现类似业务操作 SQL 的共享。但是,绑定变量最大的问题也是 peeking,在实际系统中,也是要仔细...
波形图游标功能在许多科学计算和数据分析应用中都是一种非常重要的工具,它允许用户在可视化图形上精确地定位和测量数据点。在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这样的图形化编程环境...
### Oracle中的游标详解 #### 一、引言 在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果进行逐行处理。游标分为两种主要类型:**隐式游标**和**显示游标**。此外,还可以利用游标进行...
游标图例用来显示图形中的游标,如图1所示。在图形上用游标可读取绘图区域上某个点的确切值,游标值会显示在游标图例中。 图1 图形缩放方式 图2 游标图例 选择游标图例右键快捷菜单的“创建游标”,在...
### MySQL游标(循环操作) #### 一、游标简介 在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过...
使用游标的步骤通常包括:声明游标、打开游标、提取数据、关闭游标和释放游标。 创建事务通常在SQL中通过BEGIN TRANSACTION、COMMIT或ROLLBACK语句来实现。BEGIN TRANSACTION标志着事务的开始,然后执行一系列...
静态、动态SQL及各种游标 静态SQL和动态SQL是两种不同的SQL语句执行方式,分别应用于不同的场景中。静态SQL是指在PL/SQL中直接运行的SQL语句,没有什么特别之处。动态SQL则是指利用EXECUTE IMMEDIATE语句执行的SQL...
使用游标更新数据库 使用游标更新数据库是指在游标定位下,修改或删除表中指定的数据行。使用游标对数据进行更新可以提高数据库的性能和效率。 1. 游标更新的基本概念 游标是数据库中的一种数据结构,它可以用来...
游标和异常处理 游标是 SQL 的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将...
游标是LabVIEW波形图的一个重要功能,它可以帮助用户精确地读取图形上的数据点坐标,进而进行数据分析或调试工作。本篇将详细解释如何在LabVIEW中操作波形图的游标以及实时显示坐标值。 1. **波形图的创建与数据...
Oracle 游标概述 Oracle 游标是 Oracle 数据库中的一种重要概念,用于查询数据库,获取记录集合(结果集)的指针。游标可以看作是一个临时表,你可以对其每一行的数据进行任意的操作。本文将对 Oracle 游标的概念、...
游标支持包含子查询的复杂查询,与标准SQL子查询相似,但更灵活地在PL/SQL环境中使用。 #### 五、游标中的更新与删除 使用`WHERE CURRENT OF`子句可以在游标中执行更新或删除操作,此操作需要在声明游标时使用`FOR...
游标卡尺是一种精密的测量工具,常用于工程和制造业中进行尺寸的精确测量。在三维建模领域,使用SolidWorks这样的专业软件可以创建出游标卡尺的虚拟模型,以便于设计、模拟和分析其结构与功能。SolidWorks 2016是一...
"获取多个游标的坐标8.2_labview获取游标_"这个主题主要关注如何在LabVIEW中有效地利用游标功能,特别是如何获取并操作多个游标在波形图上的位置信息。以下是对这一主题的详细阐述: 首先,我们需要理解LabVIEW中的...
游标是Oracle数据库中一个重要的概念,它是一种在内存中用于存储SQL查询结果的临时工作区域。使用游标可以方便地访问查询结果集中的每一行,这对于处理大量数据是非常有用的。游标主要分为两种类型:显式游标和隐式...
### DB2游标及动态SQL详解 #### 一、DB2游标概念与使用 **1.1 游标简介** 在DB2中,游标是一种用于遍历查询结果集的强大工具。它允许用户一行一行地处理数据,这对于需要逐行处理数据的应用场景非常有用。游标通常...