Oracle最佳实践-优化硬解析
前段时间参加oracle CAB,oracle高级服务部门做了一个数据库最佳实践的报告,其中就有一项就是解决未使用绑定变量但执行次数很多的SQL; 对于一个数据库来说如果不知道该如何优化,那么最简单最有效的优化就是减少硬解析,当然这部分优化对于DBA来说推动起来会有些难度,毕竟修改代码需要开发和业务部分配合,但是相对来说优化的难度低(绑定变量),带来的收益高,这里来介绍一下如何优化硬解析。
1. sql的执行路径
在优化之前首先要了解sql的执行路径,只有了解了sql的执行路径才能更好的了解硬解析和软解析。
1.1 SQL 解析(Parsing)
语法检查:验证 SQL 语句的语法是否正确。
语义检查:检查语义的合法性(如表、列是否存在,权限是否满足)。
共享池检查:在共享池中查找相同的 SQL 语句,避免重复解析(软解析)。
生成执行计划:如果是首次执行(硬解析),优化器会生成最佳的执行计划。
1.2 SQL 绑定(Binding)
如果 SQL 包含绑定变量(如 :1 或 :2),将实际的变量值替换到绑定变量的位置。
确保 SQL 在执行时能够正确应用输入参数。
1.3 SQL 优化(Optimization)
使用优化器(基于成本CBO或规则)评估多种执行计划。
选择具有最低成本的计划,用于后续执行。
1.4 执行计划生成(Execution Plan Generation)
确定具体的访问路径(如全表扫描、索引扫描)。
确定连接方法(如嵌套循环、哈希连接)。
1.5 SQL 执行(Execution)
根据执行计划,读取所需的数据块。
完成逻辑操作(如过滤、排序、连接)。
1.6 数据返回(Fetching)
如果是查询操作,按需从缓冲区或磁盘中提取数据。
数据按行或批量形式返回给客户端。
oracle sql执行流程图

2.硬解析VS软解析VS软软解析
通用整体性sql优化,我认为最容易最有效的方式就是减少系统的硬解析比例,使用绑定变量减少硬解析的比例可以有效提升系统的整体性能。
硬解析,软解析和软软解析对比
| 类型 | 硬解析(Hard Parsing) | 软解析(Soft Parsing) | 软软解析(Fast Parsing) |
| 定义 | SQL 无匹配计划,需重新生成执行计划。 | SQL 匹配到已有计划,但需部分验证。 | SQL 完全命中缓存,直接使用执行计划。 |
| 触发条件 | 不使用绑定变量或缓存中无匹配。 | 使用绑定变量,计划部分验证通过。 | 使用绑定变量,计划完全匹配,无需验证。 |
| 资源消耗 | 最高(CPU、内存开销大)。 | 较低(部分解析验证)。 | 最低(几乎无消耗)。 |
| 性能 | 最差(增加解析时间、锁竞争)。 | 中等(解析步骤减少,性能提升)。 | 最优(完全缓存命中,解析效率最高)。 |
| 优化方法 | 统一 SQL 语句结构、使用绑定变量、增加库缓存大小。 | 减少库缓存竞争、优化游标共享设置。 | 高效利用绑定变量和共享游标机制。 |
3.了解系统整体的解析情况
最常用的办法是通过AWR报表来了解系统的整体的解析情况,其中关键的指标如下几个指标

Parses(SQL):每秒or事务解析次数,反应了系统的繁忙层度,数据来源v$sysstat statistics parse count (total)
Hard parses(SQL):每秒or事务硬解析次数,反应了系统硬解析的整体状况,数据来源v$sysstat statistics parse count (hard)
Soft Parse%:最重要的一个指标, 软解析比例,无需多说的经典指标,数据来源v$sysstat statistics的parse count(total)和parse count(hard)。 合理值>95% Soft Parse %是AWR中另一个重要的解析指标,该指标反应了快照时间内 软解析次数 和 总解析次数 (soft+hard 软解析次数+硬解析次数)的比值,若该指标很低,那么说明了可能 存在剧烈的hard parse硬解析,大量的硬解析会消耗更多的CPU时间片并产生解析争用(此时可以考虑使用cursor_sharing=FORCE); 理论上我们总是希望 Soft Parse % 接近于 100%, 但并不是说100%的软解析就是最理想的解析状态,通过设置 session_cached_cursors参数和反复重用游标我们可以让解析来的更轻量级,即通俗所说的利用会话缓存游 标实现的软软解析(fast parse)
Execute to Parse%:Execute to Parse% 指标反映了执行解析比 计算方法 1-(parse/execute) , 目标为100% 即接近于只执行而不解析。 数据来源v$sysstat statistics parse count (total) 和execute count
在oracle中解析往往是执行的先提工作,但是通过游标共享 可以解析一次 执行多次, 执行解析可能分成多种场景:
解析与执行的场景
-
硬解析 SQL(Hard Coding):
- 特点:硬解析一次,执行一次。
- 表现:
- 执行解析比接近 1:1。
Execute to Parse%接近 0(极差)。- 软解析率(Soft Parse%) 也接近 0%。
- 问题:高频硬解析会显著增加系统资源消耗。
-
绑定变量但仍需软解析:
- 特点:每次执行前仍需软解析。
- 表现:
- 执行解析比接近 1:1。
Execute to Parse%仍接近 0(差)。- 软解析率(Soft Parse%) 可能很高。
- 问题:虽然比硬解析略好,但解析开销仍然较高。
-
高效的解析与执行(理想场景):
- 特点:通过静态SQL、绑定变量、
session_cached_cursor、open_cursors等技术,实现“解析一次,执行多次”。 - 表现:
- 执行解析比为 N:1(N 越大越好)。
Execute to Parse%趋近于 100%。- 软解析比例降低,解析开销显著减少。
- 优化效果:非常适合 OLTP 环境。
- 特点:通过静态SQL、绑定变量、
通俗地说 soft parse% 反映了软解析率, 而软解析在oracle中仍是较昂贵的操作, 我们希望的是解析1次执行N次,如果每次执行均需要软解析,那么虽然soft parse%=100% 但是parse time仍可能是消耗DB TIME的大头。 Execute to Parse反映了 执行解析比,Execute to Parse和soft parse% 都很低 那么说明确实没有绑定变量 , 而如果 soft parse% 接近99% 而Execute to Parse 不足90% 则说明执行解析比低, 可以通过静态SQL、动态绑定、session_cached_cursor、open cursors等技术减少软解析。
Parse CPU To Parse Elapsd:该指标反映了 快照内解析CPU时间和总的解析时间的比值(Parse CPU Time/ Parse Elapsed Time); 若该指标水平很低,那么说明在整个解析过程中 实际在CPU上运算的时间是很短的,而主要的解析时间都耗费在各种其他非空闲的等待事件上了(如latch:shared pool,row cache lock之类等) 数据来源 V$sysstat 的 parse time cpu和parse time elapsed
4.查询未绑定变量的高频 SQL
V$SQL 视图包含每个 SQL 语句的执行统计信息,可以用以下 SQL 查询未绑定变量的高频 SQL
SELECTsql_id,executions,parse_calls,sql_text,module,parsing_schema_name,ROUND(executions / (parse_calls + 1), 2) AS execution_to_parse_ratioFROMv$sqlWHEREexecutions > 1000 -- 执行次数大于 1000(可调整)AND parse_calls > 0 -- 存在解析调用AND executions / (parse_calls + 1) < 10 -- 执行与解析比值较低(表示未使用绑定变量)ORDER BYexecutions DESC;
-- 说明
-- executions:SQL 语句的执行次数。
-- parse_calls:SQL 被解析的次数(高解析调用可能是未绑定变量的症状)。
-- execution_to_parse_ratio:执行次数与解析次数的比值,越低越可能是未绑定变量。
-- sql_text:SQL 文本,可以查看具体内容。
重点关注用户schema下的高频sql

检查具体 SQL 的绑定变量使用情况
SELECT * FROM v$sql_bind_captureWHERE sql_id = '&SQL_ID';
VALUE_STRING 最近一次捕获的绑定变量值(以字符串形式存储)。
5.检查高负载 SQL
使用 Oracle 提供的 Active Session History(ASH)或 AWR 报告分析高负载 SQL:
- ASH:分析活跃会话中的高频 SQL
- AWR 报告:查看执行次数最多的 SQL 列表
-
根据查出的结果在针对sql做具体的分析
在AWR中可以按各种维度来定位top sql 然后再做针对性优化

查询 AWR 中执行次数最多的 SQL
-- 查询 AWR 中执行次数最多的 SQLSELECT *FROM dba_hist_sqlstatWHERE executions_delta > 1000 -- 根据执行次数筛选ORDER BY executions_delta DESC;
查询平均执行时间超过10秒的sql
SELECTSQL_ID,ELAPSED_TIME / 1000000 AS ELAPSED_SECONDS,EXECUTIONS,SQL_TEXTFROMV$SQLWHEREEXECUTIONS > 0 -- 排除未执行的SQLAND (ELAPSED_TIME / EXECUTIONS) / 1000000 > 10 -- 平均执行时间超过10秒ORDER BYELAPSED_SECONDS DESC;
利用sql_monitor优化
----sql monitor---------SELECT DBMS_SQLTUNE.report_sql_monitor(sql_id => '&sql_id', type => 'TEXT') AS report FROM dual;
被sql monitor监控的触发条件
执行时间>5秒
SQL 的累计执行时间(CPU 时间 + I/O 时间)超过 5秒。
这个时间阈值可以通过参数 SQLMON_THRESHOLD 调整:
ALTER SESSION SET "_sqlmon_threshold" = 2; -- session级别设置阈值为 2 秒ALTER SESSION SET "_sqlmon_threshold" = 2; --系统级别设置阈值为2秒
并行执行(Parallel Execution):
SQL 使用了并行执行计划(Parallel Execution)。
即使执行时间较短,但因为使用了并行,SQL 会自动被监控。
被强制要求监控:
通过 SQL Hints 强制启用 SQL Monitor
SELECT /*+ MONITOR */ ... FROM table_name;相关文章:
Oracle最佳实践-优化硬解析
前段时间参加oracle CAB,oracle高级服务部门做了一个数据库最佳实践的报告,其中就有一项就是解决未使用绑定变量但执行次数很多的SQL; 对于一个数据库来说如果不知道该如何优化,那么最简单最有效的优化就是减少硬解析,…...
Windows中将springboot项目运行到docker的容器中
0,先打包好项目,再启动docker 1,在Java项目根目录下创建一个名为Dockerfile的文件(没有扩展名),并添加以下内容。 # 使用OpenJDK的基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app# 将项…...
30、使用ESP8266跟SG90舵机制作四足蜘蛛机器人
目录 1、简介 2、使用例子 3、代码解析 4、资源下载 正文 1、简介 本篇使用ESP8266跟SG90舵机制作四足蜘蛛机器人,使用的180度舵机有8个,需要一块16路舵机控制板,也可以使用小一点的控制板8路也够了。下面开始今天的教程,源码在文章末尾自行下载,力求大家都能看懂。…...
相比普通LED显示屏,强力巨彩软模组有哪些优势?
在科技技术的加持下,LED显示屏市场各类创新产品层出不穷,为市场带来了无限可能。其中,强力巨彩R系列H版(软模组)凭借其独特的技术优势,在行业内脱颖而出。那么,相比常规LED显示屏,强…...
部门操作和日志
PostMapping("/depts") public Result add(RequestBody Dept dept){System.out.println("添加部门: " dept);deptService.add(dept);return Result.success(); }Override public void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setU…...
antdv-<a-button>中属性的使用
UI组件库(User Interface Component Library)是一种预先构建好的、可重用的用户界面元素集合,旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等,能够提供一致的外观和交互风格…...
python解题之寻找最大的葫芦
问题描述 问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 �a 和另外两张相同牌面值的牌 �b。如果两个人同时拥有“葫芦”,我们会优先比较牌 &#…...
iOS 环境搭建教程
本文档将详细介绍如何在 macOS 上搭建 iOS 开发环境,以便进行 React Native 开发。(为了保证环境一致 全部在网络通畅的情况下运行) 1. 安装 Homebrew Homebrew 是 macOS 的包管理工具,我们将通过它来安装开发所需的工具。 安装…...
制作容器镜像
容器基础镜像制作 由于项目使用麒麟操作系统,需要在麒麟桌面操作系统和服务器操作系统里编译代码,如果每次都在物理机和虚拟机里编译太不方便,也无法使用常用的 jenkins k8s 组成的 CI/CD 编译环境,如果基于整个ISO太大了&#…...
基于Python对xslxslx文件进行操作
利用python操作表格文件 读取xsl格式文件-源码 import xlrd# 读取xls文件中的工作对象 wb xlrd.open_workbook(示例文件/xxx物理学与信息技术学院.xls) print(wb)# 获取所有的工作表名称 sheet_names wb.sheet_names() # print(sheet_names)# 选择要读取的具体工作表对象 s…...
语音芯片赋能可穿戴设备:开启个性化音频新体验
在科技日新月异的今天,语音芯片与可穿戴设备的携手合作,正引领我们步入一个前所未有的个性化音频时代。这一创新融合,用户可以享受到更加个性化、沉浸式的音频体验。下面将详细介绍语音芯片与可穿戴设备合作的优点和具体应用。 1. 定制化音效…...
Unity学习笔记(一)如何实现物体之间碰撞
前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 如何实现物体之间碰撞 实现物体之间的碰撞关键组件:Rigidbody 2D(刚体)、Collider 2D(碰撞体)、Sprite Renderer(Sprite渲染器) 实现物体之间的碰撞 …...
LinkedList与链表 和 链表面试题
目录 一. ArrayList 与 LinkedList 的优缺点: 二. LinkedList 的分类 三.链表的十道面试题: 1. 删除链表中等于给定值 val 的所有节点。题目链接 2. 反转⼀个单链表。题目链接 3. 输⼊⼀个链表,输出该链表中倒数第k个结点。题目链接 4.给定…...
ansible自动化运维(一)简介及清单,模块
相关文章ansible自动化运维(二)playbook模式详解-CSDN博客ansible自动化运维(三)jinja2模板&&roles角色管理-CSDN博客ansible自动化运维(四)运维实战-CSDN博客 ansible自动化运维工具 1.什么是自…...
利用代理IP爬取Zillow房产数据用于数据分析
引言 最近数据分析的热度在编程社区不断攀升,有很多小伙伴都开始学习或从事数据采集相关的工作。然而,网站数据已经成为网站的核心资产,许多网站都会设置一系列很复杂的防范措施,阻止外部人员随意采集其数据。为了解决这个问题&a…...
大屏开源项目go-view二次开发1----环境搭建(C#)
最近公司要求做一个大屏的程序用于展示公司的产品,我以前也没有相关的经验,最糟糕的是公司没有UI设计的人员,领导就一句话要展示公司的产品,具体展示的内容细节也不知道,全凭借自己发挥。刚开始做时是用wpf做的&#x…...
【含开题报告+文档+PPT+源码】基于微信小程序的点餐系统的设计与实现
开题报告 随着互联网技术的日益成熟和消费者生活水平与需求层次的显著提升,外卖点餐平台在中国市场上迅速兴起并深深植根于民众日常生活的各个角落。这类平台的核心在于构建了一个基于互联网的强大订餐服务系统,它无缝整合了餐饮商户资源与广大消费者的…...
k8s中用filebeat文件如何收集不同service的日志
以下是一个详细的从在 Kubernetes 集群中部署 Filebeat,到实现按web-oper、web-api微服务分离日志并存储到不同索引的完整方案: 理解需求:按服务分离日志索引 在 Kubernetes 集群中,有web-oper和web-api两种微服务,希…...
Mysql数据库中,什么情况下设置了索引但无法使用?
在MySQL数据库中,即使已经正确设置了索引,但在某些情况下索引可能无法被使用。 以下是一些常见的情况: 1. 数据分布不均匀 当某个列的数据分布非常不均匀时,索引可能无法有效地过滤掉大部分的数据,导致索引失效。 …...
QT6学习第十一天 Qt Quick控件 Control
QT6学习第十一天 Qt Quick控件控件基类 Control按钮类控件指示器类控件输入类控件日期类控件 Qt Quick控件 Qt Quick本身是为了移动触摸界面而生的,但Qt的跨平台性也决定了它需要支持多种系统。为了支持桌面平台开发,从Qt 5.1开始,增加了新的…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
