广告
返回顶部
首页 > 资讯 > 数据库 >怎么解析Cursor和绑定变量
  • 480
分享到

怎么解析Cursor和绑定变量

2024-04-02 19:04:59 480人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关怎么解析Cursor和绑定变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如下是我就这次演讲的内容做的一点概括,里面也包含了我

这篇文章将为大家详细讲解有关怎么解析Cursor和绑定变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

如下是我就这次演讲的内容做的一点概括,里面也包含了我回答一些朋友的问题的邮件内容:

Oracle里的cursor分为两种:一种是shared cursor,一种是session cursor。

所谓的shared cursor就是指缓存在library cache里的一种library cache object,说白了就是指缓存在library cache里的sql和匿名pl/sql。它们是oracle缓存在library cache中的几十种library cache object之一,它所属于的namespace是CRSR(也就是cursor的缩写)。你信里提到的parent cursor和child cursor都是shared cursor,它们都是以library cache object handle的方式存在library cache里,当一条sql第一次被执行的时候,会同时产生parent cursor和child cursor,parent cursor的library cache object handle的heap 0里会存储其child cursor的地址,这个sql的执行计划会存储在上述child cursor的library cache object handle的heap 6中,第一次执行上述sql所产生的parent cursor和child cursor的过程也就是所谓的"硬解析"主要做的事情。如果上述sql再次执行,Oracle只需要去扫描相应的library cache object handle,找到上次硬解析后产生的child cursor,把里面的parse tree和执行计划直接拿过用就可以了,这就是所谓的"软解析"。

Oracle里的第二种cursor就是session cursor,session cursor又分为三种:分别是implicit cursor,explicit cursor和ref cursor。所谓的session cursor其实就是指的跟这个session相对应的server process的PGA里(准确的说是UGA)的一块内存区域(或者说内存结构),它的目的是为了处理且一次只处理一条sql语句(这里是指一个implicit cursor一次只处理一条sql,explicit cursor和ref cursor处理sql的数量是由你自己所控制)。

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

当某个session cursor和其对应的shared cursor建立关联后,如果你把cursor_space_for_time调成true,当一个session cursor处理完一条sql后,它就不会被destroy,Oracle会把其cache起来(我们称之为soft closed session cursor),这么做的目的是很明显的,因为这个soft closed掉的session cursor已经和包含其执行计划和parse tree的shared cursor建立了联系,那么当在这个session中再次执行同样的sql的时候,Oracle就不再需要去扫描library cache了,直接把刚才已经soft closed掉的session cursor拿过来用就好了,这就是所谓的"软软解析"

最后我说一下特别容易混淆的Oracle里几个关于cursor的参数的含义:

1、open_cursors

open_cursors指的是在单个session中同时能以open状态存在的session cursor的最大数量 

2、session_cached_cursors

session_cached_cursors指的是单个session中同时能cache住的soft closed session cursor的最大数量

3、cursor_space_for_time

关于cursor_space_for_time有三点需要注意:1) 10.2.0.5和11.1.0.7里它已经作废了;2) 把它的值调成true后如果还同时用到了绑定变量,则由于Bug 6696453的关系,可能会导致logical data corruption;3) 把它的值调成true后,所有的child cursor在执行完后依然会持有library cache pin,直到其parent cursor关闭

首先我们来看一下library cache object所属于的namespace的定义:

1. Library cache objects are grouped in namespaces according to their type.

2. Each object can only be of one type.

3. All the objects of the same type are in the same namespace.

4. A namespace may be used by more than one type.

5. The most important namespace is called cursor (CRSR) and houses the shared SQL cursors.

你在obj$看到的关于namespace的解释当然是不全的,因为像shared cursor这样的library cache object根本就不在obj$里。

所以实际上你可以这样理解:namespace是针对缓存在library cache里的library cache object来说的,那为什么obj$里会有namespace的定义呢?----因为library cache object有一部分的来源就是来自于数据库里已经存在的、固化的object的metadata。

我们再来看一下library cache object所属于的namespace的详细说明:

Currently there are 64 different object types but this number may grow at any time with the introduction of new features. Examples of types are: cursor, table, synonym, sequence, index, LOB, Java source, outline, dimension, and so on. Not every type corresponds to a namespace. Actually, there are only 32 namespaces which, of course, are also subject to increase at any time.

What is a certainty is that all the objects of the same type will always be stored in the same namespace. An object can only be of one type, hence the search for an object in the library cache is reduced to a search for this object in the corresponding namespace.

Some namespaces contain objects of two or three different types. These are some of the most commonly used namespaces:

CRSR: Stores library objects of type cursor (shared SQL statements)

TABL/PRCD/TYPE: Stores tables, views, sequences, synonyms, procedure specifications, function specifications, package specifications, libraries, and type specifications

BODY/TYBD: Stores procedure, function, package, and type bodies

TRGR: Stores library objects of type trigger

INDX: Stores library objects of type index

CLST: Stores library objects of type cluster

The exact number and name of namespaces in use depends on the server features that are used by the application. For example, if the application uses Java, namespaces like JVSC (java source) and JVRE (Java resource) may be used, otherwise they will not be used.

Note: These namespaces do not store tables, clusters, or indexes as such, only the metadata is stored.

最后的结论是:我也看不到KQD.H的内容,所以我也无法知道Oracle里所有的namespace的准确namespace id,但是其实你是可以通过library cache dump里的所有namespace的列表来猜出来的,因为这显示是按namespace id来排序的。

可以通过library cache dump知道某个Oracle的版本下所有的namespace,如下所示的是9.2.0.6的:

LIBRARY CACHE STATISTICS:
namespace           gets hit ratio      pins hit ratio    reloads   invalids
-------------- --------- --------- --------- --------- ---------- ----------
CRSR                1078     0.860      4989     0.935         17          0
TABL/PRCD/TYPE       596     0.636       780     0.624          0          0
BODY/TYBD              1     0.000         0     0.000          0          0
TRGR                   1     0.000         1     0.000          0          0
INDX                  76     0.474        45     0.111          0          0
CLST                 148     0.953       203     0.961          0          0
OBJE                   0     0.000         0     0.000          0          0
PIPE                   0     0.000         0     0.000          0          0
LOB                    0     0.000         0     0.000          0          0
DIR                    0     0.000         0     0.000          0          0
QUEU                  30     0.700        30     0.700          0          0
OBJG                   0     0.000         0     0.000          0          0
PROP                   0     0.000         0     0.000          0          0
JVSC                   0     0.000         0     0.000          0          0
JVRE                   0     0.000         0     0.000          0          0
ROBJ                   0     0.000         0     0.000          0          0
REIP                   0     0.000         0     0.000          0          0
CPOB                   0     0.000         0     0.000          0          0
EVNT                   1     0.000         1     0.000          0          0
SUMM                   0     0.000         0     0.000          0          0
DIMN                   0     0.000         0     0.000          0          0
CTX                    0     0.000         0     0.000          0          0
OUTL                   0     0.000         0     0.000          0          0
RULS                   0     0.000         0     0.000          0          0
RMGR                   0     0.000         0     0.000          0          0
IFSD                   1     0.000         0     0.000          0          0
PPLN                   0     0.000         0     0.000          0          0
PCLS                   0     0.000         0     0.000          0          0
SUBS                   0     0.000         0     0.000          0          0
LOCS                   0     0.000         0     0.000          0          0
RMOB                   0     0.000         0     0.000          0          0
RSMD                   0     0.000         0     0.000          0          0
JVSD                   0     0.000         0     0.000          0          0
ENPR                   0     0.000         0     0.000          0          0
RELC                   0     0.000         0     0.000          0          0
STREAM                 0     0.000         0     0.000          0          0
APPLY                  0     0.000         0     0.000          0          0
APPLY SOURCE           0     0.000         0     0.000          0          0
APPLY DESTN            0     0.000         0     0.000          0          0
TEST                   0     0.000         0     0.000          0          0
CUMULATIVE          1932     0.778      6049     0.888         17          0

从结果里看9.2.0.6是一共有40个namespace。

关于怎么解析Cursor和绑定变量就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么解析Cursor和绑定变量

本文链接: https://www.lsjlt.com/news/65933.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么解析Cursor和绑定变量
    这篇文章将为大家详细讲解有关怎么解析Cursor和绑定变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如下是我就这次演讲的内容做的一点概括,里面也包含了我...
    99+
    2022-10-19
  • 怎么使用ORACLE中的绑定变量
    这篇文章主要讲解了“怎么使用ORACLE中的绑定变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用ORACLE中的绑定变量”吧!一、绑定变量的作用:...
    99+
    2022-10-18
  • 怎么使变量进行Flex数据绑定
    小编给大家分享一下怎么使变量进行Flex数据绑定,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Flex数据绑定有关Flex数据绑定的知识收集整理了一下:Flex数...
    99+
    2023-06-17
  • 如何解析Python 变量命名规则和定义变量
    这篇文章给大家介绍如何解析Python 变量命名规则和定义变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、定义变量语法规则:变量名 = 值定义变量的语法规则中间的‘=',并不...
    99+
    2023-06-22
  • C#并非所有变量都已绑定错误怎么解决
    C#中的"变量未绑定"错误通常出现在以下情况下:1. 变量未声明:确保你在使用变量之前先声明它。在C#中,变量需要在使用之前进行声明...
    99+
    2023-08-19
    C#
  • centos怎么绑定域名解析
    在centos中绑定域名解析的方法首先,在centos命令行中打开hosts文件;sudo vi /etc/hostshosts文件打开后,在文件添加需要绑定的域名即可;127.0.0.1 www.baidu.com...
    99+
    2022-10-24
  • SQL*Plus中怎么利用DATE类型绑定变量
    这篇文章将为大家详细讲解有关SQL*Plus中怎么利用DATE类型绑定变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 SQ...
    99+
    2022-10-18
  • 怎样解析C++中的C++变量定义
    怎样解析C++中的C++变量定义,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在使用C++变量变量时,通常要把C++变量名定义为容易使用阅读和能够描述所含数据用处的名称,而...
    99+
    2023-06-17
  • 云主机怎么绑定域名解析
    要将云主机绑定域名解析,您需要进行以下步骤:1. 在域名注册商处购买或注册一个域名,并获得域名管理界面的登录账号和密码。2. 登录域...
    99+
    2023-09-13
    云主机
  • 域名绑定解析错误怎么办
    域名绑定解析错误的解决方法:1.进入域名代理商网站,登录域名管理控制台;2.点击左侧菜单栏“域名管理”选项;3.选择解析错误的域名,点击“管理”;4.点击“域名解析”,将原有的域名解析删除;5.点击“添加解析”,添加一条记录类型为“a记录”...
    99+
    2022-10-19
  • 域名与空间怎么解析绑定
    1. 首先,登录域名服务商的控制面板,找到该域名的DNS解析设置。2. 在DNS解析设置中,添加一条A记录或CNAME记录,分别对应...
    99+
    2023-06-10
    域名与空间 域名 空间
  • scss变量解析不了怎么解决
    这篇文章主要介绍“scss变量解析不了怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“scss变量解析不了怎么解决”文章能帮助大家解决问题。 scss 变量...
    99+
    2022-10-19
  • 域名解析和绑定有什么区别
    本篇内容主要讲解“域名解析和绑定有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“域名解析和绑定有什么区别”吧!域名解析域名解析,又叫域名指向,就是把注册的域名指向网站空间的IP,让人们通...
    99+
    2023-06-06
  • linux云主机怎么绑定域名解析
    要将域名解析绑定到Linux云主机上,您需要执行以下步骤:1. 在域名注册商处设置域名解析:登录域名注册商提供的管理界面,找到域名解...
    99+
    2023-08-21
    linux云主机 云主机
  • c/c++中变量的声明和定义深入解析
    不管是函数还是变量的声明 ,都是为了告诉编译器我要使用这个变量或者函数了,用于类型检查。在定义 的时候编译器是不会分配任何内存的, 比如下面的函数:复制代码 代码如下:void fu...
    99+
    2022-11-15
    变量 c++ c
  • iis怎么添加网站绑定域名解析
    在iis中添加网站并绑定域名解析的流程:1.在计算机中打开iis管理器;2.点击“网站”选择“添加网站”选项;3.填写网站名称、页面路径和主机名,确认添加;4.找到刚添加的站点,右键点击“编辑绑定”选项;5.点击右上角的“添加”按钮;点击右...
    99+
    2022-10-17
  • 解析好的域名怎么绑定服务器
    将解析好的域名与服务器进行绑定的方法:1.远程连接服务器,并打开iis管理器;2.点击左侧菜单栏“网站”选项;3.选择站点,右键选择“编辑绑定”;4.点击右上角的“添加”按钮;5.填写域名和服务器地址,确认即可;将解析好的域名与服务器进行绑...
    99+
    2022-10-23
  • dos中怎么定义和引用变量
    dos中怎么定义和引用变量,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。变量定义和引用1.MS-DOS shell 对变量、命令、命令行参数的大小写区分吗? 不...
    99+
    2023-06-08
  • C++中怎么定义和使用变量
    这篇文章将为大家详细讲解有关C++中怎么定义和使用变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++定义变量有两种主要的做法 符号常量 (#define) 常值变量 (const)符号...
    99+
    2023-06-17
  • 域名解析和主机绑定有什么区别
    域名解析与主机绑定的区别有以下几点指向不同域名解析是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定;而主机绑定是将域名与主机的空间进行绑定,使一个域名被指导向一特定...
    99+
    2022-10-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作