oracle sql 子游标_Oracle 父子游标

游标

从Oracle数据库管理员的角度上说,游标是对存储在库缓存中的可执行对象的统称。SQL语句是存储在库缓存中的,它是游标。除了它之外,还有Oracle的存储过程也是存储在库缓存中的可执行对象,从Oracle DBA的角度上说,它也是游标。Oracle也把它算为游标,在某些和游标相关的视图中,也会显示存储过程的一些信息的。但从开发者的角度说,只有SQL语句才是游标。

子游标与父游标。

如果两个游标的文本一模一样,但由于环境不同,比如,游标所操作的表是不同用户下的同名表,这两个游标是不能共享执行计划的。它们都有各自的执行计划存在库缓存中。这两个游标就是子游标,Oracle还会建立一个父游标,父游标中没有执行计划,它只是文本相同但执行计划不同的所有游标的代表。

其实在库缓存中,即使没有文本相同的子游标,Oracle也会为每个游标都创建父游标。因为父游标是文本相同的子游标的代表吗,所有文本相同的游标共享同一个父游标。

也就是说,只要你执行SQL语句,Oracle都会在库缓存中保存一父一子两个游标。如果你执行了文本相同但环境不同因而不能共享执行计划的SQL语句,那么一个父游标可能就对应多个子游标。

父游标没有执行计划,它只有一些信息管理性数据,Oracle添加它的目的就是为了管理文本相同的游标。有一个视图是专门针对父游标的,就是V$sqlarea。

V$SQL常用字段

SHARABLE_MEM:游标所占共享内存

SORTS:游标完成的排序次数

FETCHES:抓取的次数

PX_SERVERS_EXECUTIONS:以并行方式执行的总次数

EXECUTIONS:执行次数

LOADS:游标被加载或重新加载到库缓存中的次数。游标只所以被重新加载有可能是游标无效或库缓存内存不足。

INVALIDATIONS:游标的无效次数

PARSE_CALLS:游标的解析次数,包括硬解析与软解析

DIRECT_WRITES:游标直接写的次数

DISK_READS:游标执行了多少次物理读

USER_IO_WAIT_TIME:用户I/O等待时间

CPU_TIME:游标解析、执行、抓取时所用的CPU时间。单位是微秒。

ELAPSED_TIME:游标解析、执行、抓取时所用的总时间。单位是微秒。

V$sql_text视图

这个视图的目的是显示过长的SQL语句文本。对于这些文本过长的SQL语句,在V$sql_text中将分多行显示完整的SQL语句,每行显示64字节。效果如下:

步1:我发布一个文本很长的SQL语句,这个语句没什么意义,只是想让它文本长一点:

SQL> select case id when 1 then 'one' when 2 then 'two' end case, name from (select * from ui1 where id<=1) where id=1 or id=2;

CAS NAME

--- -----

one 1

步2:我需要知道此语句的HASH值,然后以此HASH值为条件在V$SQL_TEXT中查询:

SQL> select sql_text, hash_value from v$sqlarea where sql_text like 'select case id when 1 then%';

SQL_TEXT HASH_VALUE

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

select case id when 1 then 'one' when 2 then 'two' end case, name from 4270697726

(select * from ui1 where id<=1) where id=1 or id=2

此语句的HASH值是4270697726。按照此HASH值在V$sql_text中查询:

SQL> select rownum, sql_text from v$sqltext where hash_value=4270697726;

ROWNUM SQL_TEXT

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

1 e from (select * from ui1 where id<=1) where id=1 or id=2

2 select case id when 1 then 'one' when 2 then 'two' end case, nam

V$open_cursor与Open_cursor参数

这个视图和参数涉及游标的打开。什么是游标的打开,就是在库缓存中,用户在软、硬解析游标时,会在游标对象的句柄上加一个锁,也就是Library cache lock。在解析并执行完游标后,这个锁并不会马上去掉,而是会一直保留着,直到用户发出了Close命令关闭游标时为止。我们在SQL*Plus命令窗口中发出的命令,在抓取完所有行后,SQL*Plus将自动为我们发出Close命令来关闭游标。

SQL> show parameter cursor_sharing

NAME TYPE VALUE

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

cursor_sharing string EXACT

当游标打开时,Library cache lock将一直保持,这样,即使库缓存内存紧张,需要老化对象,也不会老化这些还正在加锁的对象。因此,如果用户不停的要求数据库服务器打开游标、执行SQL,但却忘了关闭游标,这很容易耗尽共享池的内存。为此,Oracle准备了一个参数,就是Open_cursor,它的默认值在9i下是50,在10g中是300,也就是说,在10g下,每个会话最多只能同时打开300个游标。有了这个限制,就不用害怕用户不停的打开游标但又不关闭它,而耗尽共享池内存了。

如果会话同时打开的游标数量超出了Open_cursor参数的限制,Oracle将禁止会话打开新的游标。同时报出错误:ORA-01000: 超出打开游标的最大数 。

在用户断开会话的连接后,会话打开的这些游标将自动关闭。

V$open_cursor视图专用来查看当前会话打开的游标信息。它只能查看当前会话打开的游标。

CURSOR_SHARING参数

如果应用程序中有很多类似下面这样的SQL语句:

select * from 某表 where id=1;

select * from 某表 where id=2;

select * from 某表 where id=50;

等等,这些SQL语句严格来说是无法共享游标(也就是共享执行计划)的,但是这些语句所需要的执行计划其实都是一样的。无论你在表中查询ID为1的行还是查询ID为100的行,执行方式应该是一样的。如果你想让这样的语句共享游标,那么,你可以改变Cursor_sharing参数的值。

此参有三个值:

EXACT:这个值是默认值。除非游标文本一模一样,否则不会共享游标。

SIMILAR:这个最智能,如果游标只有条件中的数据值部分不同,并且库缓存中原有游标的执行计划对于新执行的SQL语句也是最优的,将不再为SQL语句创建新的游标,而是让它共享库缓存中原有的游标。

FORCE :不比较执行计划是否最优,只要游标中除了条件中的数据值部分不同外,其他部分都相同,就会共享游标。

Oracle可以将一部分执行次数比较多的游标的信息缓存在会话的私人内存PGA中,这样当被缓存游标再被执行时,很多数据不必再到库缓存中寻找,会话直接可以在自己的PGA中取出。这可以大大提高软解析的速度,这样的解析被称为更软的软解析(或快速软解析)。一般来说,会话在执行游标时,第一步会到自己的PGA中搜索游标,如果找到了,这就是更软的软解析。如果游标没有被缓存到PGA中,再到库缓存中查找,如果找到了这就是普通的软解析。如果库缓存中也没有,就进行硬解析,重新生成游标相关数据和执行计划。

如果会话在执行游标时,发现游标的总的执行次数已经超过了三次,就会将游标信息缓存在自己的PGA中。此参数的作用是设定一个会话共可以缓存多少个游标。

此参数的值如果比较大,将会耗用更多的PGA和共享池内存,但是,这对提高软解析速度是很有帮助的。如果你的数据库软解析耗用了过多的时间,可以尝试加大此参数的值。在10g中,此参数默认值是30。在大型OLTP应用中,此参数的值一般都设置为几百甚至上千。

version count

V$SQLAREA有一个列是V$SQL中没有的,就是:VERSION_COUNT,它是对应同一父游标的子游标的数量。如果这个数字太高,可能代表由于某些原因使本可以共享执行计划的游标没有共享

我们使用实验SQL,通过视图v$sqlarea和v$sql可以观察到library cache中的父子游标情况。v$sqlarea中保存父游标信息,而v$sql保存子游标信息。

SQL> select /*+version_count */count(*) from t where wner='SCOTT';

COUNT(*)

----------

14

SQL> select sql_id, version_count fromv$sqlareawhere sql_text like 'select /*+version_count */count(*)%';

SQL_ID VERSION_COUNT

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

54fuganxkyky6 1

SQL> select sql_id, child_number fromv$sql where sql_id='54fuganxkyky6';

SQL_ID CHILD_NUMBER

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

54fuganxkyky6 0

SQL语句(sql_id=54fuganxkyky6)对应一个父游标和一个子游标。

version count就表示当前父游标下对应子游标的个数。如果一个父游标对应的子游标version count过多,也就是对应了很多的子游标对象。这样,当server process检查可共享的游标时,就需要长时间的检索子游标列表。

最有名的version count过多问题是由于设置cursor_sharing参数为similar后,引发的version count错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程操作时操作系统时间片_从零开始自制操作系统(15):内核多线程

1.多线程原理&#xff1a;&#xff08;1&#xff09;概述&#xff1a;多线程是指CPU可以在一段时间中并行执行多个程序&#xff0c;比如我们可以一边听音乐、一边写代码&#xff08;这两个程序可以“同时进行”&#xff0c;我们称之为多进程&#xff0c;而多进程实现的本质就是…

听说java又过气了?看我运用大数据分析2019年java发展趋势!

近些年的技术圈&#xff0c;单以计算机语言界来说&#xff0c;稳坐第一把太师椅的 Java “或将被取代”、迎接转折点、Java 项目工程师风光不再等言论不绝于耳。在焦虑的大环境下&#xff0c;所有人好像都看起来很焦虑不安。 针对这类“唱衰论”&#xff0c;也不难理解。不仅&…

打开git界面_使用 Gitea 快速搭建私有 Git 版本控制服务

1. 前言分布式版本控制工具 Git 已经是现代软件源代码版本控制首选方案之一。公有 Git 服务提供商 国外知名如 GitHub 国内网络延迟高,Gitlab 涉嫌对中国的歧视不推荐。国内有 Gitee、Coding 生态还不错。但是一般公司的源代码除非开源项目是不会放在公有 Git 服务上的。所以我…

dev项目属性按钮是灰色_Spring Boot 中的项目属性配置

阅读本文约需要5分钟大家好&#xff0c;我是你们的导师&#xff0c;我每天都会在这里给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。上次老师跟大家分享了Spring Boot 如何使用 SLF4J 进行日志记录&#xff0c;今天跟大家分享一下 Spring Boot 中的项…

diskgenius扩容c盘重启电脑卡住_电脑开机显示:reboot and select proper boot device怎么办?...

今天就碰到有一个知友问&#xff0c;自己电脑开机就提示&#xff1a;reboot and select proper boot device&#xff0c;整个人都懵了&#xff0c;不知道怎么办?其实对于电脑出现问题&#xff0c;大家不要着急&#xff0c;坚哥就来为大家分析下原因以及试着去解决。第一种原因…

2019年1月份GitHub上最热门的Java开源项目

相信大多数程序猿们都回归工作岗位啦&#xff0c;不知道是否调整好心态了呢&#xff1f;1月份GitHub上最热门的Java开源项目新鲜出炉&#xff0c;还是一起来看看都有哪些项目上榜吧&#xff1a; 1JavaGuide https://github.com/Snailclimb/JavaGuide Star 22668 【Java学习面试…

大并发下程序出错_Python并发编程理论篇

前言其实关于Python的并发编程是比较难写的一章&#xff0c;因为涉及到的知识很复杂并且理论偏多&#xff0c;所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚&#xff0c;在学习之前首先要记住一个点&#xff1a; 并发编程永远的宗旨就是提高程序的运行效率&am…

2020 idea 查看内存消耗_idea内存如何设置

更具自己硬件环境做出相应的调整.在这里简单说一下这些参数作用以及参考更改参数-Xms768m-Xmx768m-XX:MaxPermSize250m-XX:ReservedCodeCacheSize64m-server-XX:NewSize128m-XX:UseParNewGC-XX:ParallelGCThreads8-XX:UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction60-…

月薪30K程序员花了一个小时,用c++做出经典扫雷游戏 !

上次发过一个俄罗斯方块的游戏源码&#xff0c;由于是通过Easy X实现的&#xff0c;但是很多和我一样的新手&#xff0c;一开始不知道Easy X是什么&#xff0c;到时源码拿过去之后&#xff0c;运行报错&#xff0c;我这次发的扫雷&#xff0c; 也是通过Easy X实现&#xff0c;…

用python写web网页_从零开始,使用python快速开发web站点(1) | 学步园

环境&#xff1a;ubuntu 12.04 python版本: 2.73 ok,首先&#xff0c;既然是从零开始&#xff0c;我们需要的是一台可以运行的python的计算机环境&#xff0c;并且假设你已经安装好了python, 然后&#xff0c;既然是快速开发&#xff0c;必不可少的需要用到框架&#xff0c;py…

修改so_货代、海运操作、船务操作还分不清?船公司SO文件看不懂?

货代是货物代理&#xff08;freight forwarding agent&#xff09;的简称&#xff0c;是指经营受他人委托&#xff0c;为其提供代办运输手续&#xff0c;代提、代发、代运货物服务的业务。货物代理&#xff0c;有些是中间商就是自己没有船或者飞机的或者船公司、航空公司&#…

一行代码蒸发64亿人民币!黑客盯上区块链漏洞!Python真的变态!

此前认为&#xff0c;区块链技术由于分布存储、加密算法等技术的应用&#xff0c;拥有了不可篡改、可追溯等被认为是“万无一失”的特性。然而&#xff0c;该特性主要针对存储在区块中的信息来说&#xff0c;以文中开头的案例为例&#xff0c;区块链技术保障了可以追溯到这64亿…

太吾绘卷第一世攻略_建平中学高二数学周练卷(2020.09)

试卷图片仅供学习交流使用&#xff0c;答案仅供参考【往期内容】高一是坎, 高二是坡, 高三是峰! 最全学习攻略新高一数学教材必修第一册第一章习题答案往年高中9月开学考月考数学试卷汇总2020上海高考复交综评录取率top202020北京大学强基计划数学试题2020上海16区零志愿、名额…

用python编写最简单的记事本_Python使用字典实现的简单记事本功能示例

本文实例讲述了Python使用字典实现的简单记事本功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a; from time import sleep, strftime user "Cytus" calendar {} def welcome(): print "Welcome to use this calendar. %s" % user print &quo…

多线程百度网盘爬虫Python完整源码

#coding: utf8import re #正则表达式模块import urllib2 #获取URLs的组件import timefrom Queue import Queueimport threading, errno, datetimeimport jsonimport requests #Requests is an Apache2 Licensed HTTP libraryimport MySQLdb as mdbDB_HOST 127.0.0.1DB_USER r…

自动补足算法是什么_数据、算法岗的几点经验分享!

learners | 作者Datawhale | 来源目录有哪些好的秋招经验分享&#xff1f;机器学习中常用的最优化方法有哪些&#xff1f;想通过数据竞赛来提升实践能力&#xff0c;作为小白有什么入门经验&#xff1f;(今日问题)有哪些好的秋招经验分享&#xff1f;1李玲 - 携程算法工程师(…

python支持中文路径_打开python遍历中文目录得到的文件路径报错

各位朋友们好&#xff0c;我是一名python新手&#xff0c;现在遇到一个问题&#xff0c;恳请各位朋友们能指点一下我。 我的环境是:ubuntu14.04系统,python2.7 用python遍历一个目录&#xff0c;目录层次结构如下: 这是主目录: /home/chaoma/superboard/mydata/input/productio…

我精心珍藏的Python代码技巧

01.****简洁的表达式 image 点评&#xff1a;Python因为简洁高效而出名&#xff0c;就是因为语法非常简单&#xff0c;而且内置了很多强大的数据结构&#xff1a; 比如我们可以大量用推导列表来生成很多简洁的代码 比如我们可以用if else组合&#xff0c;本来需要2-3行代码写…

平移刚体上各点的加速度和速度_大物学习笔记(一)——刚体力学

第一次写笔记&#xff0c;或多或少都会有很多的不足。疫情期间一直都是网课的学习&#xff0c;书本也没有带回来&#xff0c;经常都是在草稿本上随手推导一下公式&#xff0c;隔几天翻了几页&#xff0c;自己推导的东西就不见了。所以总想着来总结一下&#xff0c;把学的东西稍…

python函数和类的区别_Python中类中的方法还有区别?

上一篇&#xff0c;我们讲到Python类中的属性是有区别的&#xff0c;爱思考的小伙伴们可能就会问了&#xff0c;Python中的方法是不是也有区别呢&#xff1f;是的&#xff0c;而且Python中的方法区别更大&#xff0c;让我们来看看吧~ Python类中的三种方法 Python中的方法可以分…