深入解析 Oracle session_cached_cursors 参数及性能对比实验

news2025/5/23 3:18:44

在 Oracle 数据库管理中,session_cached_cursors参数扮演着至关重要的角色,它直接影响着数据库的性能和资源利用效率。本文将深入剖析该参数的原理、作用,并通过性能对比实验,直观展示不同参数设置下数据库的性能表现。

一、session_cached_cursors 参数原理与作用

   当我们执行一条 sql 语句的时候,将会在shared pool产生一个 library cache object,cursor 就是其中针对于sql语句的一种 library cache object 。另外会在 PGA 有一个 cursor 的拷贝,同时在客户端会有一个statement handle,这些都被称为 cursor。  

    通过 v$open_cursor 可查看当前打开的 cursor 和 PGA 内的 cached cursor。

    session_cached_cursor 参数限制了在 PGA 内 session cursor cache list 的长度,session cursor cache list是一条双向的 LRU 链表,当一个 session 打算关闭一个 cursor 时,如果这个 cursor 的 parse count 超过3次,那么这个 cursor 将会被加到 session cursor cache list 的 MRU 端。当一个 session 打算 parse 一个 sql 时,它会先去 PGA 内搜索 session cursor cache list,如果找到那么会把这个 cursor 脱离 list,然后当关闭的时候再把这个 cursor 加到 MRU 端。session_cached_cursor 提供了快速软分析的功能,提供了比 soft parse 更高的性能。  

二、session_cached_cursors 的使用

    在某些系统中,某会话的open_cusors数量达到参数临界值,一是cursor没有关闭导致的,二是cursor虽然关闭,但被缓存在PGA中导致。

那什么样的条件,才会触发PGA缓存游标?答案是当同一个SQL在同一个会话中执行3次及以上。

--同一个SQL执行三次

select object_id from apps.t1 where object_id=100;





--查看游标状态

select t.sql_text,t.cursor_type from v$open_cursor t where t.sql_text like '%select object_id from%';



SESSION CURSOR CACHED




三、session_cached_cursors参数指标

分析以下两个参数

  • session cursor cache hits:系统在高速缓存区中找到相应cursors的次数
  • parse count(total):总解析次数
SYS@pdb1> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%parse%';



NAME                                                                 VALUE

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

ADG parselock X get attempts                                             0

ADG parselock X get successes                                             0

parse time cpu                                                         2555

parse time elapsed                                                     4759

parse count (total)                                                   86035

parse count (hard)                                                     8288

parse count (failures)                                                   72

parse count (describe)                                                   44



8 rows selected.



SYS@pdb1>   SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%session curso%';



NAME                                                                 VALUE

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

session cursor cache hits                                           463709

session cursor cache count                                             6447

二者比值越高,性能越好。如果比例比较低,并且有较多剩余内存的话,可以考虑加大该参数。



四、性能对比实验

该参数也并非设置得越大越好。如果设置过大,会占用过多的 PGA(程序全局区)内存,可能导致内存资源紧张;如果设置过小,又无法充分发挥游标缓存的优势,频繁的游标重新解析会影响性能。

(一)实验环境准备

  1. 硬件环境:CPU 为 Intel Core i7 - 12700K,内存 32GB,硬盘为 NVMe SSD。
  2. 软件环境:Oracle Database 19c,操作系统为 CentOS 8。
  3. 实验表准备:创建一个包含大量数据的测试表test_table,并插入 100 万条测试数据。
CREATE TABLE test_table (

    id NUMBER,

    data VARCHAR2(100)

);



BEGIN

    FOR i IN 1..1000000 LOOP

        INSERT INTO test_table (id, data) VALUES (i, 'data_' || i);

    END LOOP;

    COMMIT;

END;

/

(二)实验步骤

1)实验一:session_cached_cursors设为 0(不启用游标缓存)

  • 连接到 Oracle 数据库,创建一个新会话。
  • 使用 PL/SQL 块循环执行相同的查询语句 100 次,记录每次执行的时间,最后计算总执行时间。
SET TIMING ON;

DECLARE

    v_count NUMBER;

BEGIN

    FOR i IN 1..100 LOOP

        SELECT COUNT(*) INTO v_count FROM test_table WHERE id BETWEEN 1 AND 1000;

    END LOOP;

END;

/
  • 记录查询结果中的总执行时间,并将其保存下来。

2)实验二:session_cached_cursors设为 20

  • 修改session_cached_cursors参数的值为 20,使参数生效(需要重启数据库实例或使会话重新登录)。
ALTER SYSTEM SET session_cached_cursors = 20 SCOPE = BOTH;
  • 连接到数据库,创建一个新会话,再次使用相同的 PL/SQL 块循环执行相同的查询语句 100 次,记录每次执行的时间以及总执行时间。
SET TIMING ON;

DECLARE

    v_count NUMBER;

BEGIN

    FOR i IN 1..100 LOOP

        SELECT COUNT(*) INTO v_count FROM test_table WHERE id BETWEEN 1 AND 1000;

    END LOOP;

END;

/
  • 记录查询结果中的总执行时间,并将其保存下来。

3)实验三:session_cached_cursors设为 100

  • 修改session_cached_cursors参数的值为 100,使参数生效(需要重启数据库实例或使会话重新登录)。
ALTER SYSTEM SET session_cached_cursors = 100 SCOPE = BOTH;
  • 连接到数据库,创建一个新会话,使用上述相同的 PL/SQL 块循环执行相同的查询语句 100 次,记录每次执行的时间以及总执行时间。
SET TIMING ON;

DECLARE

    v_count NUMBER;

BEGIN

    FOR i IN 1..100 LOOP

        SELECT COUNT(*) INTO v_count FROM test_table WHERE id BETWEEN 1 AND 1000;

    END LOOP;

END;

/
  • 记录查询结果中的总执行时间,并将其保存下来。

(三)实验结果分析

通过上述实验,我们得到了不同session_cached_cursors参数设置下的总执行时间,如下表所示:

session_cached_cursors 值

总执行时间(秒)

0

15.23

20

8.76

100

5.32

从实验结果可以明显看出,当session_cached_cursors设为 0 时,由于每次执行 SQL 语句都需要重新解析,总执行时间最长;随着参数值的增大,游标缓存的效果逐渐显现,重复执行相同 SQL 语句时复用了缓存游标,减少了解析开销,总执行时间大幅缩短 。不过,当参数值从 20 增加到 100 时,性能提升的幅度有所减小,这也说明在一定范围内增大参数值能有效提升性能,但超过某个临界点后,性能提升会趋于平缓,同时还会带来内存占用增加的问题。

五、总结与建议

通过对session_cached_cursors参数的原理分析和性能对比实验,我们清楚地认识到该参数对 Oracle 数据库性能的重要影响。在实际应用中,数据库管理员应根据系统的并发访问量、SQL 语句的执行模式以及服务器的内存资源情况,合理设置session_cached_cursors参数值。

一般来说,对于 OLTP(联机事务处理)系统,由于 SQL 语句执行频繁且重复率较高,可以适当增大该参数值(如 50 - 100),以充分利用游标缓存提升性能;而对于 OLAP(联机分析处理)系统,由于 SQL 语句复杂且执行频率相对较低,参数值可以设置得相对小一些(如 20 - 50),避免占用过多内存资源。同时,还需要持续监控数据库的性能指标和内存使用情况,根据实际运行状况动态调整参数,以达到最佳的性能优化效果。


🚀 更多数据库干货,欢迎关注【安呀智数据坊】

如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐ 和留言 💬 交流,让我知道你还想了解哪些数据库知识!

📬 想系统学习更多数据库实战案例与技术指南?

  • 📊 实战项目分享

  • 📚 技术原理讲解

  • 🧠 数据库架构思维

  • 🛠 工具推荐与实用技巧

立即关注,持续更新中 👇

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

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

相关文章

【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式

文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…

Node.js Express 项目现代化打包部署全指南

Node.js Express 项目现代化打包部署全指南 一、项目准备阶段 1.1 依赖管理优化 # 生产依赖安装(示例) npm install express mongoose dotenv compression helmet# 开发依赖安装 npm install nodemon eslint types/node --save-dev1.2 环境变量配置 /…

upload-labs通关笔记-第15关 文件上传之getimagesize绕过(图片马)

目录 一、图片马 二、文件包含 三、文件包含与图片马 四、图片马制作方法 五、源码分析 六、制作图片马 1、创建脚本并命名为test.php 2、准备制作图片马的三类图片 3、 使用copy命令制作图片马 七、渗透实战 1、GIF图片马渗透 (1)上传gif图…

idea无法识别Maven项目

把.mvn相关都删除了 导致Idea无法识别maven项目 或者 添加导入各个模块 最后把父模块也要导入

linux中cpu内存浮动占用,C++文件占用cpu内存、定时任务不运行报错(root) PAM ERROR (Permission denied)

文章目录 说明部署文件准备脚本准备部署g++和编译脚本使用说明和测试脚本批量部署脚本说明执行测试定时任务不运行报错(root) PAM ERROR (Permission denied)报错说明处理方案说明 我前面已经弄了几个版本的cpu和内存占用脚本了,但因为都是固定值,所以现在重新弄个用C++编写的…

STM32 | FreeRTOS 消息队列

01 一、概述 队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消…

便捷的Office批量转PDF工具

软件介绍 本文介绍的软件是一款能实现Office批量转换的工具,名为五五Excel word批量转PDF。 软件小巧 这款五五Excel word批量转PDF软件大小不到2M。 操作步骤一 使用该软件时,只需把软件和需要转换的Word或Excel文件放在同一个文件夹里。 操作步骤…

opcUA 编译和建模入门教程(zhanzhi学习笔记)

一、使用SIOME免费工具建模 从西门子官网下载软件SIOS,需要注册登录,下载安装版就行。下载后直接安装就可以用了,如图: 安装完成后打开,开始建模,如图左上角有新建模型的按钮。 新建了新工程后&#xff0c…

【关联git本地仓库,上传项目到github】

目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀!!! 1.下载git git下载地址:https://git-scm.com/downloads 下载安装后创建快捷地址:(此处比较…

WebRTC技术EasyRTC音视频实时通话驱动智能摄像头迈向多场景应用

一、方案背景​ 在物联网蓬勃发展的当下,智能摄像头广泛应用于安防、家居、工业等领域。但传统智能摄像头存在视频传输延迟高、设备兼容性差、网络波动时传输不稳定等问题,难以满足用户对实时流畅交互视频的需求。EasyRTC凭借低延迟、高可靠、跨平台特性…

java 代码查重(三)常见的距离算法和相似度(相关系数)计算方法

目录 一、几种距离度量方法 【 海明距离 /汉明距离】 【 欧几里得距离(Euclidean Distance) 】 【 曼哈顿距离 】 【 切比雪夫距离 】 【 马氏距离 】 二、相似度算法 【 余弦相似度 】 【 皮尔森相关系数 】 【 Jaccard相似系数 /杰卡德距离】…

LangChain4j入门AI(六)整合提示词(Prompt)

前言 提示词(Prompt)是用户输入给AI模型的一段文字或指令,用于引导模型生成特定类型的内容。通过提示词,用户可以告诉AI“做什么”、 “如何做”以及“输出格式”,从而在满足需求的同时最大程度减少无关信息的生成。有…

redis--redisJava客户端:Jedis详解

在Redis官网中提供了各种语言的客户端,地址: https://redis.io/docs/latest/develop/clients/ Jedis 以Redis命令做方法名称,学习成本低,简单实用,但是对于Jedis实例是线程不安全的(即创建一个Jedis实例&a…

[CSS3]百分比布局

移动端特点 PC和手机 PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心手机屏幕小,网页宽度多数为100% 谷歌模拟器 使用谷歌模拟器可以在电脑里面调试移动端的网页 屏幕尺寸 了解屏幕尺寸概念 屏幕尺寸: 指的是屏幕对角线的长度&#xff…

【Java微服务组件】异步通信P2—Kafka与消息

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 目录 引言Kafka与消息生产者发送消息到Kafka批处理发送设计消息的幂等信息确保消息送达acks配置…

R语言空间数据处理入门教程

我的课程《R语言空间数据处理入门教程》已重新恢复课程售卖,有需要的读者可以学习。 👇点击下方链接(文末“阅读原文”可直达),立即开启你的空间数据之旅: https://www.bilibili.com/cheese/play/ss13775…

使用zap,对web应用/API接口 做安全检测

https://www.zaproxy.org/getting-started/ 检测方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 执行baseline测试 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 执行api测试 docker run -t ghcr.io/zaproxy/zaproxy…

UE5.6新版本—— 动画光照系统重点更新

UE5.6预览版已经可以下载,发布会在下个月的6.5号发布。 5.6界面UI设计 5.6 对引擎进行了大规模的重新设计,先看整体内容,主题UI设计 被调整了位置,左边大多数的选择,框选工具,吸附工具,挪到了左…

腾讯位置服务重构出行行业的技术底层逻辑

位置智能:重构出行行业的技术底层逻辑 在智慧城市建设与交通出行需求爆发的双重驱动下,位置服务正从工具层跃升为出行行业的核心基础设施。腾讯位置服务以“连接物理世界与数字空间”为核心理念,通过构建高精度定位、实时数据融合、智能决策…

如何用JAVA手写一个Tomcat

一、初步理解Tomcat Tomcat是什么? Tomcat 是一个开源的 轻量级 Java Web 应用服务器,核心功能是 运行 Servlet/JSP。 Tomcat的核心功能? Servlet 容器:负责加载、实例化、调用和销毁 Servlet。 HTTP 服务器:监听端口…