首页 > 数据库 >oracle 发生硬解析的常见原因

oracle 发生硬解析的常见原因

时间:2024-02-04 10:11:38浏览次数:26  
标签:常见 cursor MAOB sql SQL oracle 解析

 经常有SQL的执行计划变差了,导致出现了性能问题,为什么会解析出了新的执行计划?首先可以肯定突然出现了新的执行计划,表明SQL进行了重新硬解析(注意重新硬解析不一定 产生新的执行计划),那么为什么SQL需要重新硬解析呢?今天就列举几种常见的原因:   1.自动收集统计信息  为了保证sql的最佳执行性能,oracle需要找到一个最优的执行计划,基于CBO模式的优化器必须 要知道最新的统计信息,例如条数,block数量,某个字段的选择率等,所以oracle每天凌晨都会运行一 个自动收集统计信息的job,来收集那些变化超过10%的表的最新统计信息,收集完成之后,理所当然 要对新来的sql进行使用,所以就需要进行硬解析。oracle 收集某个表统计信息后默认是不会立即invalid 所有相关的cursor,因为这样做太暴力,会引发硬解析相关的性能问题,所以巧妙的设计了一下,当某个相关sql执行的时候发现一个依赖对象最近收集过统计信息,便随机的打个一个时间戳,这个时间戳是 5个小时内某个时间戳,等到下次sql解析的时候若是发现了这个时间戳就会和当前时间进行比较,若是超过就说明已经到期,立即进行硬解析,否则还继续进行软解析。   2.没有符合条件的child cursor 典型的如bind mismatch (其他原因可以参考v$sql_shared_cursor) 当某个sql使用了绑定变量的时候,ORACLE 会记录cursor第一次硬解析时候的绑定变量的相关metadata,  当后续解析的时候便会进行检查,若是发现绑定变量类型或长度不匹配就会进行重新解析,下面我们就用一个小例子验证一下:   CREATE TABLE MAOB_T AS SELECT * FROM DBA_TABlES ;  VAR  B1 char(20);  EXEC :B1 := 'MAOB';  SELECT COUNT(*) FROM MAOB_T WHERE TABLE_NAME=:B1;    查看cursor情况 Select sql_id,child_number,first_load_time from V$SQL WHERE SQL_TEXT LIKE '%COUNT%MAOB_T%' 4v22rgk83gjnc 0 2017-12-15/22:52:46 <<可以看到新cursor已经生成 把绑定变量类型变成varchar2,sql文本不变,再次执行: VAR  B1 VARCHAR2(20);  EXEC :B1 := 'MAOB';  SELECT COUNT(*) FROM MAOB_T WHERE TABLE_NAME=:B1;   执行上述语句后再次查看 Select sql_id,child_number,first_load_time from V$SQL WHERE SQL_TEXT LIKE '%COUNT%MAOB_T%' 4v22rgk83gjnc 0 2017-12-15/22:52:46 4v22rgk83gjnc 1 2017-12-15/22:52:46 可以看到已经有两个只cursor,进一步查看cursor不能share的原因:   Select sql_id,child_number,bind_mismatch from v$sql_shared_cursor WHERE ROWNUM<10 and sql_id='4v22rgk83gjnc' sql_id,child_number bind_mismatch 4v22rgk83gjnc 0 N 4v22rgk83gjnc 1 Y  <<<bind_mismatch  可以看到由于绑定变量的原因造成的mismatch,所以硬解析产生了第二个子cursor。   3.oracle11g 提供了自适应游标功能(Adaptive Cursor Sharing),如果表上的字段存在直方图并且数据存在倾斜的场景下,那么对于传入不同的数据就会造成oracle重新尝试硬解析。   4.cursor 已经被ageout 内存  我们都知道,oracle 对于内存管理机制和很多OS管理内存机制一样,都采用了LRU(Least recently used,最近最少使用)算法, cursor作为一种library cache 中的对象也不例外,若是某个sql解析需要share pool内存时,发现free list 上并没有合适大小的内存块(chunk) 就会触发清理机制,那么之前cursor 申请的chunk就依据LRU算法规则被清理掉,这种就是age out,需要注意的是,这个是oracle的 机制,并不是OS上的swap机制,一旦某个cursor的被ageout出shared pool,那么下次执行这个sql的时候就是重新硬解析。   5.除了上述几种oracle自身的机制造成重新硬解析之外,也存在人为因素操作造成的可能 例如人为收集统计信息,人为执行了flush shared_pool 操作,手工调用dbms_shared_pool.purge 来清理某个cursor 执行了ddl 语句等。    

标签:常见,cursor,MAOB,sql,SQL,oracle,解析
From: https://www.cnblogs.com/dbahrz/p/18005666

相关文章

  • CTFer——文件操作与upload-labs解析
    一、什么是webshellwebshell就是以aspx、php、jsp等网页文件形式存在的一种命令环境也可以将其称为一种网页后门 黑客在入侵网站后,通常会将jsp、aspx或php后门文件与网站服务器web目录下正常的网页文件混在一起然后就可以使用浏览器来访问后门文件,得到一个命令执行环境,以达......
  • BeautifulSoup爬虫库应用——Python 页面解析
    爬虫技术作为信息搜集的重要手段,在大数据时代发挥着至关重要的作用。通过网络爬虫,可以高效地从各种在线源头获取大规模、多样化的数据,为大数据分析和应用提供了必要的原始材料。首先,爬虫使得大数据的采集更为全面和及时。网络上存在着庞大的信息资源,包括社交媒体、新闻网站、电子......
  • C#常见加密方式
    C#常见加密方式一、MD5MD5消息摘要算法:一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致.简单的说就是单向的加密,即是说无法根据密文推导出明文MD5主要用途:1、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数......
  • synchronized【如何保证原子性、可见性、有序性】【如何实现原子性 原理解析】【什么
    @TOC转自极客时间如何解决可见性问题?同步原理剖析什么是Monitor?什么是锁优化?......
  • volatile源码解析【解决可见性(依据happened-befor)有序性(依据内存屏障)】
    @TOC转自极客时间解决内存可见性问题volatile实现原理-源码分析......
  • excel常见错误类型
    类型一:####错误原因:一般情况下单元格的宽度放不下所有的内容,也有可能是在日期格式列中输入负数的日期或者时间。解决方案:拉大列宽,修改格式为常规。类型二:DIV/0!错误原因:数据相除运算中除数(分母)为0或者为空格解决方案:查看除数是否出现0的情况是否合理,不合理就需要重新计算,合理......
  • 数据可视化中常见的图表
    数据可视化是将数据信息通过图形的方式展示出来,以便更直观地理解和分析数据。以下是一些常用的数据可视化图表类型:柱状图(BarChart)-用于展示不同类别的数据量对比。折线图(LineChart)-展示数据随时间或其他变量变化的趋势。饼图(PieChart)-显示各部分占整体的比......
  • 12个RAG常见痛点及解决方案
    Barnett等人的论文《SevenFailurePointsWhenEngineeringaRetrievalAugmentedGenerationSystem》介绍了RAG的七个痛点,我们将其延申扩展再补充开发RAG流程中常遇到的另外五个常见问题。并且将深入研究这些RAG痛点的解决方案,这样我们能够更好地在日常的RAG开发中避免和解决......
  • 解析几何基础 反比例函数
    若\(k\)相等,两直线平行\[A(x_1,y_1),B(x_2,y_2)\]\[K=\frac{y_1-y_2}{x_1-x_2}=\frac{y_2-y_1}{x_2-x_1}\]反比例函数\[\begin{cases}y=\frac{k}{x}(k\neq0)&k\rightarrow比例系数(常见)\\y=kx^{-1}(k\neq0)\\xy=k(k\neq0)\end{cases}\]双......
  • 解析几何基础 坐标系与函数
    定义与概念正交坐标系有序实数对※在轴上的点不在象限内\(y=0\quad\quadx\)轴\(\quad\)平行于\(x\)轴的一条直线\(x=0\quad\quady\)轴\(\quad\)平行于\(y\)轴的一条直线点到轴的距离\[A(x,y)=\begin{cases}d_{A\simy}=|m-y|&y=m\\d_{A......