当前位置: 首页 > article >正文

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

在 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                                             0ADG parselock X get successes                                             0parse time cpu                                                         2555parse time elapsed                                                     4759parse count (total)                                                   86035parse count (hard)                                                     8288parse count (failures)                                                   72parse count (describe)                                                   448 rows selected.SYS@pdb1>   SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%session curso%';NAME                                                                 VALUE---------------------------------------------------------------- ----------session cursor cache hits                                           463709session 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));BEGINFOR i IN 1..1000000 LOOPINSERT 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;DECLAREv_count NUMBER;BEGINFOR i IN 1..100 LOOPSELECT 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;DECLAREv_count NUMBER;BEGINFOR i IN 1..100 LOOPSELECT 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;DECLAREv_count NUMBER;BEGINFOR i IN 1..100 LOOPSELECT 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),避免占用过多内存资源。同时,还需要持续监控数据库的性能指标和内存使用情况,根据实际运行状况动态调整参数,以达到最佳的性能优化效果。


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

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

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

  • 📊 实战项目分享

  • 📚 技术原理讲解

  • 🧠 数据库架构思维

  • 🛠 工具推荐与实用技巧

立即关注,持续更新中 👇

相关文章:

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

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

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

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

k8s面试题-ingress

场景:我通过deployment更新pod,ingress是怎么把新的请求流量发送到我新的pod的?是怎么监控到我更新的pod的? 在 Kubernetes 中,Ingress 是一种 API 对象,用于管理外部访问到集群内服务的 HTTP 和 HTTPS 路…...

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

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

分布式电源的配电网无功优化

分布式电源(Distributed Generation, DG)的大规模接入配电网,改变了传统单向潮流模式,导致电压波动、功率因数降低、网损增加等问题,无功优化成为保障配电网安全、经济、高效运行的关键技术。 1. 核心目标 电压稳定性:抑制DG并网点(PCC)及敏感节点的电压越限(如超过5%…...

【WebRTC】源码更改麦克风权限

WebRTC源码更改麦克风权限 仓库: https://webrtc.googlesource.com/src.git分支: guyl/m125节点: b09c2f83f85ec70614503d16e4c530484eb0ee4f...

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

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

idea无法识别Maven项目

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

前端三剑客之HTML

前端HTML 一、HTML简介 1.什么是html HTML的全称为超文本标记语言(HTML How To Make Love HyperText Markup Language ),是一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整…...

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

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

RabbitMQ的核心原理及应用

在分布式系统架构中,消息中间件是实现服务解耦、流量缓冲的关键组件。RabbitMQ 作为基于 AMQP 协议的开源消息代理,凭借高可靠性、灵活路由和跨平台特性,被广泛应用于企业级开发和微服务架构中。本文将系统梳理 RabbitMQ 的核心知识&#xff…...

实时监控服务器CPU、内存和磁盘使用率

实时监控服务器CPU、内存和磁盘使用率 监控内存使用率: free -g | awk NR2{printf "%.2f%%\t\t", $3*100/$2 }awk NR2{...} 取第二行(Mem 行)。 $3 为已用内存,$2 为总内存,$3*100/$2 即计算使用率。监控磁…...

linux国产机安装GCC

目录 1.包管理器安装 2.源码编译安装 linux安装GCC有两种方式,方法一,使用包管理器安装;方法二,源码安装。 1.包管理器安装 Ubuntu 基于 Debian 发行版,使用apt - get进行软件包管理;CentOS 基于 …...

python训练营打卡第30天

模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 一、导入官方库 1.标准导入:导入整个库 import mathprint(&quo…...

时间序列预测实战:用 LSTM 预测股票价格

📈 时间序列预测实战:用 LSTM 预测股票价格(PyTorch 实现) 时间序列预测是深度学习在金融领域最常见的应用之一。本文将带你使用 PyTorch 搭建一个基于 LSTM 的模型,对股票收盘价进行预测,完整掌握从数据预处理到预测结果可视化的全流程。 🎯 一、项目目标 任务:基于…...

STM32 | FreeRTOS 消息队列

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

便捷的Office批量转PDF工具

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

pom.xml中的runtime

在 Maven 的 pom.xml 文件中&#xff0c;<scope> 元素可以指定依赖项的作用范围&#xff0c;而 runtime 是其中的一个作用范围值。以下是 runtime 作用范围的含义&#xff1a; 定义&#xff1a;runtime 作用范围表示该依赖项在编译时不需要&#xff0c;但在运行时需要。…...

SpringMVC 通过ajax 实现文件的上传

使用form表单在springmvc 项目中上传文件&#xff0c;文件上传成功之后往往会跳转到其他的页面。但是有的时候&#xff0c;文件上传成功的同时&#xff0c;并不需要进行页面的跳转&#xff0c;可以通过ajax来实现文件的上传 下面我们来看看如何来实现&#xff1a; 方式1&…...

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

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

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

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

初步认识HarmonyOS NEXT端云一体化开发

视频课程学习报名入口:HarmonyOS NEXT端云一体化开发 1、课程设计理念 本课程采用"四维能力成长模型"设计理念,通过“能看懂→能听懂→能上手→能实战”的渐进式学习路径,帮助零基础开发者实现从理论认知到商业级应用开发的跨越。该模型将学习过程划分为四个维度…...

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

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

分布式ID生成器:原理、对比与WorkerID实战

一、为什么需要分布式ID&#xff1f; 在微服务架构下&#xff0c;单机自增ID无法满足跨服务唯一性需求&#xff0c;且存在&#xff1a; • 单点瓶颈&#xff1a;数据库自增ID依赖单表写入 • 全局唯一性&#xff1a;跨服务生成可能重复 • 扩展性差&#xff1a;分库分表后ID规…...

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

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

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

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

redis--redisJava客户端:Jedis详解

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

[CSS3]百分比布局

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

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

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

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

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