Oracle cursor学习笔记

@[toc]
最近在看《基于oracle的sql优化》一书,并做了笔记

一、oracle库缓存

1.1、库缓存简介

介绍oracle cursor(游标)之前先,介绍一下oracle的库缓存,Oracle库缓存(Library Cache)是SGA中的一块内存区域,它的主要作用是缓存刚刚执行过的SQL语句或者PL/SQL语句(比如存储过程、函数、触发器、包)所对应的执行计划、解析树、Pcode,Mcode等对象,SGA相关知识可以参考我之前笔记:https://blog.csdn.net/u014427391/article/details/89846006

1.2、相关概念

  • 库缓存对象:缓存在库缓存中的对象称之为库缓存对象(Library Cache Object),库缓存对象都是以库缓存对象句柄(Library Cache Object Handle)的结构存储在库缓存中的

  • 库缓存对象句柄:所谓的库缓存对象句柄其实就是一种C语言定义的复杂结构,库缓存对象句柄以哈希表(Hash table)的方式存储在库缓存中

1.3、库缓存结构

Oracle库缓存的结构,图来自《基于Oracle的SQL优化》一书:


图来自《基于Oracle的SQL优化》一书

库缓存是由一组Hash Buckets组成的,Hash Buckets里面存储的hash值相同的库缓存对象句柄,而Hash Buckets中不同的库缓存对象句柄是以指针的方式连接起来的,从而组成一条库缓存对象句柄链表

1.4、sql执行过程简介

所以执行sql的过程,会将sql的文本进行hash运算,得到对象的hash值,然后拿hash值,去Hash Buckets里遍历缓存对象句柄链表,找到对应的缓存对象句柄,然后就可以得到缓存对象句柄里对应sql执行计划、解析树等对象,所以执行相同的sql第二次执行时是会比较快的,因为不需要解析获取执行计划,解析树等对象,如果找不到库缓存对象句柄,就需要重新解析,这个过程解析过多,容易造成硬解析问题

硬解析:是指Oracle在执行目标SQL时,在库缓存中找不到可以重用的解析树和执行计划,而不得不从头开始解析目标SQL并生成相应的Parent Cursor和Child Cursor的过程。

软解析:是指Oracle在执行目标SQL时,在Library Cache中找到了匹配的Parent Cursor和Child Cursor,并将存储在Child Cursor中的解析树和执行计划直接拿过来重用,无须从头开始解析的过程。

二、oracle cursor

2.1、cursor分类

oracle的cursor其实就是库缓存对象,Oracle中的cursor分为两种,一种是shared cursor,另外一种是session cursor

2.2、shared cursor

shared cursor存储目标SQL的sql文本、解析树、该sql使用的绑定变量类型和长度、以及该SQL的执行计划等信息

oracle中的shared cursor又细分为parent cursor和child cursor,我们可以通过分别查询视图v$SQLAREAv$SQL来获取存储在parent cursor和child cursor中的缓存信息

其实parent cursor和child cursor结构是类似的,解析sql时候,sql文本是存储在parent cursor的缓存对象句柄的属性name中,而执行计划和解析树是存储在child cursor的属性heap6中的,然后parent cursor和child cursor是怎么关联的?在parent cursor的属性heap0中存储的是child cursor缓存对象句柄的地址,然后就可以知道属于这个parent cursor的所有child cursor

2.3、session cursor

session cursor是用于在当前session中解析和执行SQL,session cursor也是C语言定义的一种结构,也是以哈希表的结构存储的,不过是存储在PGA中的

  • session是和session cursor对应的,不同session的session cursor是无法共享的
  • session cursor是有生命周期的,每个session cursor在使用过程都至少会经历一次Bind、Execute、Fetch和Close中的一个或多个过程

oracle第一次解析和执行sql时,会新生成一个session cursor和一对shared cursor(parent cursor和child cursor),而其中的shared cursor会存储能被所有session共享、重用的内容(比如执行计划,解析树等),而session cursor会经历一次open、parse、bind、execute、fetch和close的一个或多次阶段

2.4、sql执行过程

综上所述,oracle执行sql过程都会先去session cursor里面找,能找到就能通过关联找到parent cursor,假如找不到,就要重新生成session cursor和一对shared cursor(parent cursor和child cursor),假如child cursor找不到,也会重新生成session cursor和child cursor

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容