我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle共享游标有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle共享游标有哪些

本篇内容介绍了“Oracle共享游标有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

首先,明确一个概念,这里讨论的游标主要是共享游标(shared cursor),跟SQL语句中定义的游标(session cursor)不是一个概念。

共享游标是用户提交SQL或PL/SQL程序块到Oracle的share pool之后,在library cache中生成的一个可执行对象,这个对象我们称之为游标(cursor)。而SQL定义游标则是SELECT语句产生的多行结果集,需要声明、打开、提取、关闭。
游标定义与分类

游标包括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都将位于该视图。

游标的生命周期


shared cursor生命周期

1)包含vpd的约束条件:SQL语句如果使用的表使用了行级安全控制,安全策略生成的约束条件添加到where子句中。
2)语法、语义、访问权限检查:检查SQL语句书写的正确性,对象存在性,用户的访问权限。
3)父游标缓存:将该游标(SQL语句)的文本进行哈希得到哈希值并在library cache寻找相同的哈希值,如不存在则生存父游标且保存在library cache中,按顺序完成后续步骤。如果此时存在父游标,则进一步判断是否存在子游标。若存在相同的子游标,则直接调用其子游标的执行计划执行该SQL语句,否则转到下一步进行逻辑优化。
4)逻辑优化:使用不同的转换技巧,生成语义上等同的新的SQL语句(SQL语句的改写),一旦该操作完成,则执行计划数量、搜索空间将会相应增长。其主要目的未进行转换的情况下是寻找无法被考虑到的执行计划。
5)物理优化:为逻辑优化阶段的SQL语句产生执行计划,读取数据字典中的统计信息以及动态采样的统计信息,计算开销,开销最低的执行计划将被选中。
6)子游标缓存:分配内存,生成子游标(即最佳执行计划),与父游标关联。可以在v$sqlarea, v$sql得到具体游标信息,父子游标通过sql_id关联。

对于仅仅完成步骤1与2的SQL语句即为软解析,否则即为硬解析。SQL语句在Oracle中的执行机理大概也类似这个,具体可见“Oracle SQL语句执行流程与顺序原理解析”。

共享游标包括父游标和子游标。

父游标是在进行硬解析时产生的,父游标里主要包含两种信息:SQL文本以及优化目标(optimizer goal),首次打开父游标被锁定,直到其他所有的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,根据hash value和address与parent cursor关联。child cursor有自己的address,即v$sql.child_address。
确定一个游标的三个主要字段:address、hash_value和child_number。sql_id可以唯一确定一个父游标,sql_id、child_number唯一确定一个子游标。

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则通常使用显示游标。

一个session cursor只能对应一个shared cursor,而一个shared cursor却可能同时对应多个session cursor。

共享游标举例

假设有用户SCOTT和KING,两者均有表EMP。先以SCOTT为例,执行如下语句:
select * from emp where empno = 7788;
SELECT * from emp where empno = 7788;
SELECT * FROM emp WHERE empno = 7788;
select * from emp where empno = 7788;

以上4条语句,第1条和第4条完全相同,第1条、第2条、第3条在大小写上有不同,查询v$sqlarea:
select sql_id, sql_text, executions
  from v$sqlarea
 where sql_text like '%empno = 7788%'
   and sql_text not like '%from v$sqlarea%';
   
执行结果见下图,有3条记录,说明产生了3个父游标,其中一个父游标执行了2次。这说明,SQL语句必须完全一致(大小写、空格回车等)才能共享,进而避免硬解析。



这3个父游标对应的子游标可以在v$sql中获得:

select sql_id,
       hash_value,
       child_number,
       plan_hash_value,
       sql_text,
       executions
  from v$sql
 where sql_text like '%empno = 7788%'
   and sql_text not like '%from v$sql%';

执行结果见下图,可见生成父游标时同时也生成一个以0为child_number的子游标,其sql_id和hash_value都和父游标相同。



然后使用KING用户,执行相同的语句。然后查询v$sqlarea父游标,结果仍然是3条记录,不过执行次数发生了变化:



再查询子游标,结果是6条记录,说明由于语句执行的环境不同而造成生成不同的子游标:


产生子游标的原因很多,比如上边的用户(SCHEMA)改变的例子,当然还有很多其他原因也可以导致子游标的产生,比如优化器模式的改变,或者绑定变量的窥视等,如果你想确定是由那种原因造成的,需要查看v$sql_shared_cursor。

共享游标其他知识点


    查看语句共享可以借助两个数据字典:V$SQLAREA和V$SQL。V$SQLAREA保留SQL语句的父游标信息,可以通过SQL_ID标识,其中的VERSION_COUNT列表示子游标的数量。V$SQL保留SQL语句的子游标信息,可以通过SQL_ID和CHILD_NUMBER标识。V$SQL_SHARED_CURSOR可以查看语句产生子游标的原因。
关于v$sql和v$sqlarea视图字段及其详解见“Oracle高资源消耗SQL语句定位”。

    父游标的关键信息是sql文本,子游标的关键信息是执行计划和执行环境。
    硬解析通常是由于不可共享的父游标造成的,如经常变动的SQL语句,或动态SQL或未使用绑定变量等。
    解决硬解析的办法则通常是使用绑定变量来解决。
    与父游标SQL文本完全一致的情形下,多个相同的SQL语句可以共享一个父游标。
    SQL文本、执行环境完全一致的情形下,子游标能够被共享,否则如果执行环境不一致则生成新的子游标。
    游标是可以被所有进程共享的,也就是说如果100个进程都执行相同的SQL语句,那么这100个进程都可以同时使用该SQL语句所产生的游标,从而节省了内存。每个游标都是由library cache中的两个或多个对象所体现的,至少两个对象:一个对象叫做父游标(parent cursor),包含游标的名称以及其他独立于提交用户的信息,从v$sqlarea视图里看到的都是有关父游标的信息;另外一个或多个对象叫做子游标(child cursors),如果SQL文本相同,但是可能提交SQL语句的用户不同,或者用户提交的SQL语句所涉及到的对象为同名词等,都有可能生成不同的子游标。因为这些SQL语句的文本虽然完全一样,但是上下文环境却不一样,因此这样的SQL语句不是一个可执行的对象,必须细化为多个子游标后才能够执行。子游标含有执行计划或者PL/SQL对象的程序代码块等。

“Oracle共享游标有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle共享游标有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

oracle游标的属性有哪些

Oracle游标的属性包括:1. %FOUND:如果游标最后一次fetch操作返回了一行数据,则返回TRUE;否则返回FALSE。2. %NOTFOUND:如果游标最后一次fetch操作没有返回任何行数据,则返回TRUE;否则返回FALSE
2023-08-30

win7共享软件有哪些

Win7共享软件有以下几种:1. Windows Media Player:可以共享媒体文件,如音乐、视频和图片等。2. Windows Live Mesh:可以共享文件夹、桌面和浏览器设置等。3. HomeGroup:可以共享文件和打印机
2023-06-12

常用的oracle游标属性有哪些

常用的Oracle游标属性有以下几种:1. %FOUND: 返回一个布尔值,如果最后一次fetch操作返回了一行数据,则返回TRUE,否则返回FALSE。2. %NOTFOUND: 返回一个布尔值,如果最后一次fetch操作没有返回任何数据
2023-09-21

oracle游标赋值的方法有哪些

在Oracle中,有多种方法可以给游标赋值,包括以下几种:1. 使用SELECT INTO语句:可以将查询结果直接赋值给游标变量。```sqlSELECT column1, column2 INTO cursor_variableFROM
2023-08-31

云服务器共享型号有哪些

1.入门型共享型号入门型共享型号是云服务器提供商为初学者或小型项目提供的基本型号。这些型号通常具有较低的计算能力和存储容量,适用于轻量级应用和网站。2.标准型共享型号标准型共享型号是适用于中小型企业和项目的常见选择。这些型号具有更高的计算能力和存储容量,可以处理更多的并发请求和数据处理任务。3.高性能型共享型号高性能型共享型号是为需要更高计算能力和存储容量的大型企业和项目设计的。这些型号通常具有更多的C...
2023-10-27

共享虚拟主机的作用有哪些

共享虚拟主机的作用包括:1. 降低成本:共享虚拟主机可以将服务器资源划分为多个虚拟环境,多个用户共享同一台物理服务器,从而降低了硬件设备和维护成本。2. 简化管理:虚拟主机提供了易于使用的控制面板,使用户可以轻松地管理和配置自己的网站、域名
2023-08-31

共享云服务器有哪些优缺点

共享云服务器的优点:1. 价格相对较低,适合小型企业或个人用户使用。2. 可以根据实际需求弹性扩展或缩减资源,不需要投入大量的硬件设备。3. 管理方便,由云服务提供商负责服务器的维护和更新,用户只需要关注自己的应用程序。4. 高可用性,云服
2023-06-07

共享云服务器的风险有哪些

共享云服务器的风险主要包括以下几个方面:1. 安全漏洞:由于多个用户共享同一台服务器,一旦其中一个用户的应用程序或数据存在漏洞或遭受攻击,整个服务器的安全都会受到威胁,其他用户的数据也可能会被泄露或损坏。2. 性能问题:共享云服务器的性能可
2023-06-08

PHP session共享的解决方案有哪些

今天小编给大家分享一下PHP session共享的解决方案有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。先了解一下为什
2023-07-04

Oracle中PLSQL函数传递游标的方法有哪些

在Oracle中,可以使用以下几种方法传递游标给PL/SQL函数:使用REF CURSOR参数:在PL/SQL函数的参数列表中,可以声明一个REF CURSOR类型的参数,然后将游标作为实参传递给函数。在函数内部可以使用这个REF CURS
2023-10-22

共享ip云服务器有哪些优缺点

共享IP云服务器是指多个租户共享同一个IP地址的云服务器。它的优点和缺点如下:优点:1. 成本低廉:由于多个用户共享同一IP地址,共享IP云服务器的租用费用通常较低,适合中小型企业或个人用户使用。2. 灵活性高:共享IP云服务器提供了弹性扩
2023-09-26

共享ip云服务器有哪些优缺点

共享IP云服务器:利弊与适用场景优点:成本效益高易于管理扩展性强可用性高可扩展性好缺点:性能受限安全问题自定义权限受限IP地址限制黑名单风险适用场景:小型企业和个人开发和测试环境低流量或非关键应用程序季节性或临时需求不适用场景:大型企业或流量密集型应用程序高性能或可靠性要求安全性和合规性要求高需自定义或完全控制服务器需专用IP地址
共享ip云服务器有哪些优缺点
2024-04-11

云服务器共享型号有哪些类型

一、内存容量云服务器的内存容量是指云服务器可以同时运行多少个应用程序,这取决于云服务器的处理能力和计算能力。一般来说,云服务器的内存容量越大,就可以提供更多的应用程序运行,并且可以在相同的硬件配置下实现更高的性能。一些云服务器的内存容量可能会比其他云服务器更大,因为它们可以处理更多的数据和应用程序。二、存储空间云服务器
云服务器共享型号有哪些类型
2023-10-28

独立IP和共享IP的区别有哪些

这篇文章主要介绍独立IP和共享IP的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、安全系数的差异。共享资源lP,说白了就是很多用户一起共享这个lP。如果其中一个网站被降级处罚,被封禁lP,还是有机会干扰
2023-06-15

独享型云主机和共享云主机有哪些区别

独享型云主机和共享云主机的区别有:1、独享云主机需要备案,共享云主机不需要;2、共享主机是分配网站空间,不允许进行刷流量,独享云主机是独享网站空间,PV数没有限制;3、共享主机会受到其他用户的影响,独享云主机不会;4、共享主机不同地区访问网
2023-02-08

编程热搜

目录