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
SELECT
sql_id,
executions,
parse_calls,
sql_text,
module,
parsing_schema_name,
ROUND(executions / (parse_calls + 1), 2) AS execution_to_parse_ratio
FROM
v$sql
WHERE
executions > 1000 -- 执行次数大于 1000(可调整)
AND parse_calls > 0 -- 存在解析调用
AND executions / (parse_calls + 1) < 10 -- 执行与解析比值较低(表示未使用绑定变量)
ORDER BY
executions DESC;
-- 说明
-- executions:SQL 语句的执行次数。
-- parse_calls:SQL 被解析的次数(高解析调用可能是未绑定变量的症状)。
-- execution_to_parse_ratio:执行次数与解析次数的比值,越低越可能是未绑定变量。
-- sql_text:SQL 文本,可以查看具体内容。
重点关注用户schema下的高频sql
检查具体 SQL 的绑定变量使用情况
SELECT * FROM v$sql_bind_capture
WHERE 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 中执行次数最多的 SQL
SELECT *
FROM dba_hist_sqlstat
WHERE executions_delta > 1000 -- 根据执行次数筛选
ORDER BY executions_delta DESC;
查询平均执行时间超过10秒的sql
SELECT
SQL_ID,
ELAPSED_TIME / 1000000 AS ELAPSED_SECONDS,
EXECUTIONS,
SQL_TEXT
FROM
V$SQL
WHERE
EXECUTIONS > 0 -- 排除未执行的SQL
AND (ELAPSED_TIME / EXECUTIONS) / 1000000 > 10 -- 平均执行时间超过10秒
ORDER BY
ELAPSED_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开始,增加了新的…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...