iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle 学习之性能优化(二)游标
  • 451
分享到

Oracle 学习之性能优化(二)游标

2024-04-02 19:04:59 451人浏览 薄情痞子
摘要

  游标是cursor的中文翻译,那么到底什么是cursor呢?oracle Concept中是这样描述的:  When an application issues a sql stat

  游标是cursor的中文翻译,那么到底什么是cursor呢?oracle Concept中是这样描述的:

  When an application issues a sql statement, the application makes a parse call to the database to prepare the statement for execution. The parse call opens or creates acursor, which is a handle for the session-specific private SQL area that holds a parsed SQL statement and other processing infORMation. The cursor and private SQL area are in the PGA.

如果上述很多的专业术语把你搞晕了,那你可以简单的理解成,一个sql语句就会对应到一个游标。

游标分类:

  • session cursor 其实就是指跟这个session相对应的server process的PGA里(准确的说是UGA)的一块内存区域(或者说内存结构),它的目的是为了处理且一次只处理一条sql语句。

  • shared cursor 缓存在librarycache(SGA下的Shared Pool)里的一种library cache object,说白了就是指缓存在library cache里的sql和匿名pl/sql。

如下图描述

  Oracle 学习之性能优化(二)游标

还记得我们在Http://lqding.blog.51cto.com/9123978/1685341这篇文章中描述的硬解析、软解析吗?

硬解析,上图中的第4种情况,需要重新构造一个游标。

软解析,上图中的第3种情况,可以在共享池中查询到可以被重用的游标信息。

软软解析:如上图,不单Shared pool中有cursor的详细信息,UGA中也会记录cursor的状态。当一个sql   发出后,如果能在uga中找到已经打开的相同游标,那么直接共用该游标。无需再进行Shared pool检   查。如果uga中的cursor已经关闭,那么直接打开游标即可。也可以直接共用游标。这两种情况都无   需进行Shared pool的检查,这种解析称之为软软解析。


Session Cursor

  使用v$open_cursor视图查询,一个会话最多可以打开的游标数由参数OPEN_CURSORS定义。

  session cursor又分为三种:分别是implicit cursor,explicit cursor和ref cursor。 

共享游标分类:

  • 父游标

    文本相同的子游标的代表。所有文本相同的SQL都共享父游标。

    父游标没有执行计划,只有一些管理性的信息,包含了SQL TEXT和相关的hash value等。

    v$sqlarea中的每一行代表了一个parent cursor, address字段表示其内存地址。

  • 子游标

    SQL文本相同,但是因执行环境等不同,会生成多个执行计划。

    包含了SQL的metadata,即使得这个SQL可以执行的所有相关信息,如OBJECT和权限,优化器设置,执行计划等。v$sql中的每一行表示了一个child cursor,根据hash value和address与parent cursor 关联。child cursor有自己的address,即V$SQL.CHILD_ADDRESS。

  

案例:

1. 创建一个用户

SQL> conn / as sysdba
Connected.
SQL> create user ding identified by ding;

User created.

SQL> grant resource,connect to ding;

Grant succeeded.

2. 生成数据

SQL> create table ding.emp as select * from scott.emp;

Table created.

数据库重启

3. 分别登录scott和ding用户,执行如下查询

SQL> select * from emp;

4. 查看父游标

SQL> COL SQL_TEXT FOR A30
SQL> COL SQL_ID FOR A20
SQL> SET LINESIZE 200
SQL> SELECT sql_text,
       sql_id,
       EXECUTIONS,
       LOADS,
       VERSION_COUNT
  FROM v$sqlarea
 WHERE sql_text LIKE '%emp';
SQL_TEXT		       SQL_ID		    EXECUTIONS	    LOADS VERSION_COUNT
------------------------------ -------------------- ---------- ---------- -------------
select * from emp	       a2dk8bdn0ujx7		     2		2	      2

两次查询共享了一个父游标,该父游标被load 2次,表示被硬解析了两次。VERSION_COUNT表示子游标的个数。

5. 查看子游标

SQL>  SELECT sql_id,sql_text,loads,child_number,parse_calls
  FROM v$sql
 WHERE sql_text LIKE '%emp';

SQL_ID		     SQL_TEXT				 LOADS CHILD_NUMBER PARSE_CALLS
-------------------- ------------------------------ ---------- ------------ -----------
a2dk8bdn0ujx7	     select * from emp			     1		  0	      1
a2dk8bdn0ujx7	     select * from emp			     1		  1	      1

6. scott用户下的语句再执行一遍,再次查看父子游标

SQL> SELECT sql_text,
       sql_id,
       EXECUTIONS,
       LOADS,
       VERSION_COUNT
  FROM v$sqlarea
 WHERE sql_text LIKE '%emp';  2    3    4    5    6    7  

SQL_TEXT		       SQL_ID		    EXECUTIONS	    LOADS VERSION_COUNT
------------------------------ -------------------- ---------- ---------- -------------
select * from emp	       a2dk8bdn0ujx7		     3		2	      2

EXECUTIONS变成了3. 

SQL> SELECT sql_id,
       sql_text,
       loads,
       child_number,
       parse_calls,
       parsing_schema_name
  FROM v$sql
 WHERE sql_text LIKE '%emp'  2    3    4    5    6    7    8  ;

SQL_ID		     SQL_TEXT				 LOADS CHILD_NUMBER PARSE_CALLS PARSING_SC
-------------------- ------------------------------ ---------- ------------ ----------- ----------
a2dk8bdn0ujx7	     select * from emp			     1		  0	      1 DING
a2dk8bdn0ujx7	     select * from emp			     1		  1	      2 SCOTT


只有文本完全相同,才能共享父游标。哪怕是语句的语义、环境等有完全相同,sql文本稍微不同都不行。例如如下sql

select * from emp;
select  * from emp;
select * from Emp;

那么当父游标相同,有多个子游标时,我们如何知道是何原因导致不共享子游标呢?

SELECT *
  FROM v$sql_shared_cursor
 WHERE sql_id = 'a2dk8bdn0ujx7'

  这个表中会有什么*MISMATCH的字段,如果该值为Y,就表示是因为这个字段指示的内容不一致导致不能共享子游标。


游标的生命周期:

(1)打开游标(dbms_sql.open_cursor)

  Open cursor: A memory structure for the cursor is allocated in the server-side private memory of the server process associated with the session, the user global area (UGA). Note that no SQL statement isassociated with the cursor yet.

  系统会在UGA中分配相关的内存结构,就是获得游标句柄的过程,这时的游标还未和sql语句有关联;

(2)解析游标(dbms_sql.parse)

  Parse cursor: A SQL statement is associated with the cursor. Its parsed representation that includes the execution plan (which describes how the SQL engine will execute the SQL statement) is loaded in the shared pool, specifically, in the library cache. The structure in the UGA is updated to store a pointer to the location of the shareable cursor in the library cache. The next section will describe parsing in more detail.

  有一条sql与游标相关联,并将执行解析过后的执行计划放在library cache(SGA的shared pool下)中,UGA中生成指向这个共享游标的指针;即session cursor 指向shared cursor。 一个session cursor 只能指向一个shared cursor,而一个shared cursor 可以指向多个session cursor。
(3)定义输出变量(dbms_sql.define_column)

  Define output variables: If the SQL statement returns data, the variables receiving it must be defined. This is necessary not only for queries but also for DELETE, INSERT, and UPDATE statements that use the RETURNING clause.

  如果sql语句返回数据,必须定义接收数据的变量,对delete,update,insert来说是returning;

(4)绑定输入变量(dbms_sql.bind_variable/bind_array)

  Bind input variables: If the SQL statement uses bind variables, their values must be provided. No check is performed during the binding. If invalid data is passed, a runtime error will be raised during the execution.

   绑定过程是不做检查的;
(5)执行游标(dbms_sql.execute)

  Execute cursor: The SQL statement is executed. But becareful, because the database engine doesn’t always do anything significant during this phase. In fact, for many types of queries, the real processing isusually delayed to the fetch phase.

  这步数据库引擎其实不做什么重要事情,而对大多数sql语句来说,真正处理过程是到fetch获取数据阶段;
(6)获取游标(dbms_sql.fetch_rows)

  Fetch cursor: If the SQL statement returns data, this step retrieves it. Especially for queries, this step is where most of theprocessing is performed. In the case of queries, rows might be partiallyfetched. In other Words, the cursor might be closed before fetching all therows.

   真正的处理过程,有返回数据的话,必须提供输出变量(dbms_sql.column_value);
(7)关闭游标(dbms_sql.close_cursor)

   Close cursor: The resources associated with the cursorin the UGA are freed and consequently made available for other cursors. The shareable cursor in the library cache is not removed. It remains there in the hope of being reused in the future.

   释放UGA中相关资源,库缓存中共享游标不会被清除。

   当游标被关闭后,还可以继续缓存在内存中,参数SESSION_CACHED_CURSORS定义当前Session已经关闭并被缓存的游标的最大数量,即单个session中同时能cache住的soft closed session cursor的最大数量。



您可能感兴趣的文档:

--结束END--

本文标题: Oracle 学习之性能优化(二)游标

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

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

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

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

下载Word文档
猜你喜欢
  • Oracle 性能优化 之 游标及 SQL
    一、游标 我们要先说一下游标这个概念。       从 Oracle 数据库管理员...
    99+
    2024-04-02
  • Oracle 学习之性能优化(七)join的实现方式
      本文讨论一下join技术背后的机制。我们知道常用的表连接有如下几种笛卡尔连接内连接左外连接右外连接全连接这些sql的写法,想必大家都很清楚了,那么这些连接的数据访问是如何实现的呢?nested...
    99+
    2024-04-02
  • golang函数性能优化与机器学习
    针对机器学习任务对 go 函数性能优化技巧:使用并发 goroutine 实现并行执行,提升性能。注意内存管理,避免逃逸分配和使用指针操作原始数据,优化内存使用。实战案例中,并行化机器学...
    99+
    2024-04-26
    机器学习 golang 函数性能优化 git 垃圾回收器
  • oracle 性能优化
    索引的说明 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护。 通常,为检索表数据...
    99+
    2024-04-02
  • 快速学习Oracle触发器和游标
    目录触发器:1、 创建一个用于记录用户操作的触发器2、创建一个当删除部门时,删除该部门下的所有雇员的触发器3、创建一个在account表插入记录之后,更新myevent数据表的触发器...
    99+
    2024-04-02
  • Go语言中数组如何优化性能?学习笔记带你走进优化之路!
    数组是计算机科学中最基本的数据结构之一。在Go语言中,数组是一个固定长度、由相同类型元素组成的序列。在一些高性能的场景中,如图形处理、游戏开发、大规模数据处理等,数组的性能优化显得尤为重要。本篇文章将介绍Go语言中数组的性能优化方法,带你...
    99+
    2023-10-20
    数组 学习笔记 http
  • PHP学习笔记:性能优化与缓存技术
    一、引言在开发和运维PHP应用程序时,性能优化是一个重要的考虑因素。随着用户量的增加,应用程序的负载可能会迅速增大,这会导致响应时间延长,甚至导致服务器崩溃。为了提供更好的用户体验和稳定的系统性能,我们需要采取一些性能优化的策略和技术。本文...
    99+
    2023-10-21
    性能优化 缓存技术 PHP
  • win7游戏性能怎么优化
    这篇“win7游戏性能怎么优化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win7游戏性能怎么优化”文章吧。win7游戏性...
    99+
    2023-07-01
  • Oracle性能优化-SQL优化(案例四)
    Oracle 性能优化 -SQL 优化 ( 案例四 ) 环境: DB:Oracle 11.2.0.1.0 问题: ERP 薪资发放节点计算时间耗时 较长,需要15 分钟左右; ...
    99+
    2024-04-02
  • 浅谈Android性能优化之内存优化
    目录1、Android内存管理机制1.1 Java内存分配模型1.2 Dalvik和ART介绍1.3 为什么要进行内存优化2、Java内存回收算法2.1判断Java中对象是否存活的算...
    99+
    2024-04-02
  • java性能优化之代码缓存优化
    目录JIT编译器版本默认情况JVM如何选择编译器?如何判断当前环境jvm使用的编译器?代码缓存代码缓存占满发生在什么情况?代码缓存默认大小如何确定正好的代码缓存?如何监控代码缓存?J...
    99+
    2024-04-02
  • Android性能优化之弱网优化详解
    目录弱网优化1、Serializable原理1.1 分析过程1.2 Serializable接口1.3 ObjectOutputStream1.4 序列化后二进制文件的一点解读1.5...
    99+
    2022-11-13
    Android 性能弱网优化 Android 弱网优化
  • 详解Android性能优化之启动优化
    目录1、为什么要进行启动优化2、启动的分类2.1 冷启动2.2 热启动2.3 温启动3、优化方向4、启动时间的测量方式4.1 使用adb 命令方式(线下使用方便)4.2 手动打点方式...
    99+
    2024-04-02
  • Android性能优化之ViewPagers + Fragment缓存优化
    目录前言1 ViewPager懒加载优化1.1 ViewPager的缓存机制1.2 ViewPager懒加载方案2 ViewPager2与ViewPager的区别前言 大家看标题,可...
    99+
    2024-04-02
  • php之性能优化案例
    php是一个很流行的脚本语言,现在很多公司(新浪、优酷、百度、搜狐、淘宝等等)在使用这种语言进行网站开发。我的这篇文章,我只是希望能够提高你的php脚本性能。请记住你的php脚本性能...
    99+
    2024-04-02
  • Python 数组 path 学习笔记:如何优化数组性能?
    Python 中的数组是一种非常常见的数据结构,它可以用来存储一系列的元素,并且支持随机访问和修改。在实际编程中,我们经常需要对数组进行一些操作,如查找、插入、删除等,而这些操作的效率往往会对程序的性能产生很大的影响。因此,如何优化数组性...
    99+
    2023-08-19
    数组 path 学习笔记
  • Oracle 性能优化-trigger问题
    Oracle 性能优化-trigger问题 问题现象 : 谓词通过唯一性索引,更新一条记录,耗时很长; 通过 AWR 查看 TOP SQL ,这个UPDATE  SQ...
    99+
    2024-04-02
  • Android 性能优化系列之bitmap图片优化
    背景 Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应用施加内存限制,默认分配的内存只有几M(...
    99+
    2024-04-02
  • PHP 性能优化:性能指标解读与分析
    php 性能优化需要关注关键性能指标(kpi),包括请求/秒 (rps)、响应时间、内存使用率、cpu 利用率和错误率。分析这些 kpi 可识别性能瓶颈。实战案例中,rps 低、响应时间...
    99+
    2024-05-10
    php 性能优化 apache 并发请求
  • Golang函数性能优化之分支预测优化
    通过理解和优化分支预测,可以显著提升 golang 函数性能:减少分支数量使用条件表达式提升分支预测器准确性优化循环结构实践结果表明,分支预测优化可将函数性能提升 20%~50%。 G...
    99+
    2024-04-17
    性能优化 分支预测 golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作