Oracle-高版本SQL优化分析(bind mismatch)

news2024/7/2 20:28:48

背景:

        接到用户报障说一套Oracle19c数据库近期出现insert语句执行变慢的情况,执行一次数据插入需要1秒+的时间,而且问题发生的数据库是跑在一体机上面,数据插入正常不应该这么慢,需要分析插入慢的原因

问题:

        数据库近期出现insert语句执行变慢的情况,执行一次数据插入需要1秒+的时间,查看问题的insert语句使用了大量的绑定变量,数量达到5000+个

55dc7d9fbeebe5c44819f165f23cf96a.png

--语句通过union构造多条数据进行批量插入
insert into table(A,B,C) 
select :1,:2,:3 
from dual 
uion all 
select :4,:5,:6 
from dual
...
uion all 
select :5098,:5099,:5100 
from dual

8ae0ca72e770001697eb40a30d5b4b78.png

 

问题分析:

        查看语句的执行信息,可以看到语句下面有多个子游标,执行速度时快时慢,有的游标执行速度最慢到达3-4秒,最快则0.1秒,每个游标的执行计划都是相同的4069240402

6a96f90f9b7fbc401a66f9155969f938.png

        我们首先排除是由于执行计划慢导致的问题一是语句的执行计划非常简单直接,就是通过查询dual然后插入表,二是语句的执行计划固定都是4069240402,但不同游标的执行速度会不一样

         这里语句比较有问题的是,语句的有大量的子游标,游标复用率极低,基本每次执行都新生成一个子游标

        继续通过10046跟踪语句的执行消耗,可以看到语句的主要消耗在CPU的execute,语句Misses in libarary cache during execute次数等于执行次数,每次执行在共享池里面均没有复用的缓存游标,也就是说每次执行都需要重新解析,结合语句存在大量的子游标,我们基本可以确定语句的主要性能瓶颈在于语句的子游标复用率极低,每次执行都需要重新硬解析生成新的子游标

0985496e44f52f7e19c9950d2879efac.png

        查看语句的游标使用情况,通过数据库字典V$SQL_SHARED_CURSOR获取到语句下面有1000+的子游标,生成子游标的原因都是为BIND_MISMATCH

df4ea630cbb24294f51064e76c76d036.png

        分析语句bind mismatch出现的原因,通过数据库字典v$sql_bind_capture查看应用SQL语句传入的绑定变量字段类型,再与插入目标表的字段类型进行比对,我们发现主要的原因为

        1 传入变量类型TIMESTAMP与目标表的类型DATE不一致

7abe3649197916cdd3816478c21e05d8.png

        2 传入变量varchar2长度跨度很大,同一个变量值,传入的长度出现分别为32,128,2000,4000,8192

f063be9ee3382dcb59e12b07235329e5.png

        根据Oracle官方对于bind mismatch的说明(Troubleshooting: High Version Count Issues (Doc ID 296377.1)),上述两种情形都会导致语句由于bind mismatch产生一个新的子游标,发生硬解析

6b8948ae25ee5000bb8ea1d585d8bccb.png

优化建议:

        1 确保应用传入SQL语句输入变量与插入的目标表一致,建议调整应用传入的变量类型为date,保持与目标表一致

        2 通过event 10503调大会话级别的字符串bind buffer,以确保会话生成的游标buffer长度一致,建议将bind buffer调为4000(接近sql绑定变量的max_length)

event 10503测试:

--创建测试表
create table TESTBIND1
(
  aaa VARCHAR2(4000),
  bbb VARCHAR2(4000),
  ccc VARCHAR2(4000)
);
--会话设置10503事件
ALTER SESSION SET EVENTS '10503 trace name context forever, level 4000';
--执行插入
DECLARE v_AAA VARCHAR2(3000):='A';
        v_BBB VARCHAR2(10):='B';
        v_CCC VARCHAR2(10):='C';
BEGIN    
    INSERT INTO TESTBIND1 VALUES(v_AAA,v_BBB,v_CCC);
    COMMIT;
END;
/
--关闭10503事件
ALTER SESSION SET EVENTS '10503 trace name context  off';

        通过上述的SQL代码进行测试,可以看到会话设置了10503事件之后,即使客户端申明的字符变量长度小于4000,语句变量传入数据库时,绑定变量的长度会被固定为4000

910f2412be5b6c7cf23bedfdfd7a7d93.png

 

 

 

 

 

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

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

相关文章

chatgpt赋能python:使用Python绘制散点图:了解基本语法,数据可视化。

使用Python绘制散点图:了解基本语法,数据可视化。 数据是任何研究的基石,因此对于从事各种数据处理工作的人员来说,数据可视化是一个非常重要的工具。Python作为一种非常受欢迎的编程语言,具有广泛的应用,…

centos7虚拟机安装

提前创建好一个非系统盘的文件路径,存放centos虚拟机的系统文件 下载centos 7 centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com) 先创建新的虚拟机 点击下一步 点击下一步 点击下一步 选择Linux(L)和CentOS 7 64位,然后点击下一步 位置…

编译原理笔记5:从正规式到词法分析器(2):NFA 记号识别、确定化、并行算法、子集法构造DFA

目录 NFA 识别记号的并行方法NFA 上识别记号的确定化方法状态集 T 的 ε-闭包(T)ε-闭包算法 NFA 并行算法NFA 并行算法例:识别 abb 和 abab 从 NFA 到 DFA(子集法构造 DFA ) NFA 识别记号的并行方法 之前的文章中写过的 “用一个输入字符串…

【八大排序(八)】归并排序高阶篇-非递归版

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:八大排序专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 归并非递归版 1. 前情回顾2. 归并非递归基…

JVM的内容

0、Java基础考点 1、谈谈你对Java的理解 平台无关性(一次编译,到处运行)GC(垃圾清理)语言特性(泛型、反射)面向对象(封装、继承、多态)类库异常处理 2、Java是如何实现平台无关性的(一处编译,到处运行) 编译时(语法和语义进行检测&#xf…

0012-TIPS-pawnyable : Use-After-Free

原文 Linux Kernel PWN | 040203 Pawnyable之UAF https://pawnyable.cafe/linux-kernel/LK01/use_after_free.html 题目下载 漏洞代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> #includ…

【踩坑】Windows11安装WSL2,然后装miniconda

Windows11安装WSL2 跟着官方文档一步步来就完事了&#xff0c;你要在vscode上用还是用docker都有教程微软WSL文档 遇到问题 Installing, this may take a few minutes… WslRegisterDistribution failed with error: 0x80370102 Please enable the Virtual Machine Platform W…

chatgpt赋能python:Python收费怎么办?

Python收费怎么办&#xff1f; Python是一门非常流行的编程语言&#xff0c;特别是在数据科学和机器学习领域中。许多人使用Python来编写自己的应用程序和脚本&#xff0c;但是有些人会对Python的收费问题感到困惑。本文将介绍Python的收费情况以及如何解决这个问题。 Python…

Shell - 02_shell的自定义变量

一、shell的自定义变量 1.定义变量&#xff1a;变量名变量值 如&#xff1a;num10 2.引用变量&#xff1a;$变量名 如&#xff1a;i$num 把变量 num 的值付给变量 i 3.显示变量&#xff1a;使用 echo 命令可以显示单个变量取值 如&#xff1a;echo $num 4.清除变量&…

高校学生公寓安全用电物联网平台的应用

摘要:本文针对高校学生公寓用电特点,从安全用电角度提出了一套集用电管理、计量、恶性负载智能识别控制、实时跟踪检测等功能于一体的数字化安全用电管理系统技术解决方案———学生公寓智能控电管理系统。 关键词:公寓恶性负载安全用电智能系统 0、引言 近年来,为了响应国家…

webpack编译打包

1.安装webpack npm install webpack webpack-cli --save-dev 2.添加命令 在package.json文件中添加启动命令 3.打包 webpack.config.js文件 通过配置文件构建&#xff1a;npx webpack --config webpack.config.js 4.文件结构 src:用于存放代码&#xff0c;一般入口为index.…

HQChart实战教程64-自定义分时图标题栏

HQChart实战教程64-自定义分时图标题栏 分时图标题栏步骤1. 替换分时图标题格式化输出函数2. 格式化输出函数说明HQChart插件源码地址完整的demo源码分时图标题栏 分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间…

android内部存储和外部存储

我们在开发Android应用的过程中&#xff0c;避免不了要用到数据持久化技术&#xff0c;所谓的数据持久化就是将RAM中的瞬时数据保存到ROM中&#xff0c;保证在App退出或者手机关机后数据不会丢失。我们常用的数据持久化的方式有文件存储&#xff0c;数据库存储&#xff0c;Shar…

动手实现条件随机场(下)

引言 本文基于PyTorch实现条件随机场&#xff0c;实现CRF层参考论文Neural Architectures for Named Entity Recognition中关于CRF层的描述。包含大量的图解和例子说明&#xff0c;看完一定能理解&#xff01; 论文地址&#xff1a; https://arxiv.org/pdf/1603.01360.pdf 也可…

chatgpt赋能python:Python搜索算法:如何提高你的搜索体验

Python 搜索算法&#xff1a;如何提高你的搜索体验 在当今信息爆炸的时代&#xff0c;搜索已成为许多人获取信息的主要途径。而 Python 的搜索算法&#xff0c;也在此背景下日渐受到重视。本篇文章将深入探讨 Python 搜索算法&#xff0c;介绍以及如何使用它来提高你的搜索体验…

SpringBoot整合模板引擎Thymeleaf(5)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 在本节教程中&#xff0c;我们在之前案例的基础上详细介绍利用Thymeleaf实现国际化。 项目结构 依赖文件 请在pom.xml文件中添加如下依赖。 <?xml version"…

Android 9 蓝牙协议初始化

先讲一下Application类的使用 要使用自定义的Application&#xff0c;首先就是要自己新建一个Application的子类&#xff0c;然后把它的名字写在manifest文件里面的application标签里的android:name属性就行&#xff0c;如我的Application子类名字是BaseApplication&#xff0c…

java入门3(程序流程结构)

目录 大部分和C语言一样 顺序结构 选择结构 简单if语句 ​ 多重if结构 嵌套if结构 Switch选择结构 if和Switch嵌套 循环结构 while循环 do while 语句 for循环 break和continue break 中断指令&#xff0c;结束所在层的循环 continue:中断指令 中断本轮的循环&…

chatgpt赋能python:Python收发短信:简单可靠的解决方案

Python收发短信&#xff1a;简单可靠的解决方案 如果您需要向客户发送定期提醒或通知的短信&#xff0c;则 Python 是一种简单易用的解决方案。在本文中&#xff0c;我们将介绍如何使用 Python 发送和接收短信&#xff0c;并探讨一些流行的短信 API。 什么是短信 API&#xf…

深入分析vfio-user设备实现原理 —— Client侧

文章目录 前言数据结构protocolVFIOUserHdrvfio_user_commandVFIOUserHdr flags 设备模型VFIODeviceVFIODevIOVFIOContIO VFIOPCIDeviceVFIOKernPCIDeviceVFIOUserPCIDevice proxyVFIOUserMsgVFIOProxy 流程详解消息发松流程DMA映射流程 前言 数据结构 protocol VFIO User P…