几种常见重新硬解析的原因

经常有客户提说某个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重新尝试硬解析。具体内容,可以参考另外一篇博客。
https://blogs.oracle.com/database4cn/oracle-11g-sql-adaptive-cursor-sharing

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 语句等。

原文地址:https://blog.51cto.com/11298469/2429836

时间: 2024-10-30 15:44:46

几种常见重新硬解析的原因的相关文章

几种常见的xml解析方式 SAX,DOM,PULL以android为例

准备工作 首先是一个person.xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="18"> <name>allen</name> <age>36</age> </person> <person id="28"> <name>

解析XML文件的几种常见操作方法:DOM/SAX/DOM4j

1 <?xml version="1.0" encoding="utf-8"?> 2 <root> 3 <class name="class1"> 4 <student> 5 <name>张三</name> 6 <age>20</age> 7 <sex>男</sex> 8 </student> 9 <stude

Java几种常见的编码方式

Java综合 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言.由于人类的语言有太多,因而表示这些语言的符号太多,无法用计算机中一个基本的存储单元—— byte 来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解.我们可以把计算机能够理解的语言假定为英语,其它语言要能够在计算机中使用必须经过一次翻译,把它翻译成英语.这个翻译的过程就是编

JAVA几种常见的编码格式(转)

简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别:Java 中经常需要编码的场景:出现中文问题的原因分析:在开发 Java web 程序时可能会存在编码的几个地方,一个 HTTP 请求怎么控制编码格式?如何避免出现中文问题? 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答

Oracle SQL的硬解析和软解析

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析.还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析. DML:INSERT,UPDATE,DELETE,SELECT DDL:CREATE,DROP,ALTER 一.  SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过

Python爬虫突破封禁的6种常见方法

转 Python爬虫突破封禁的6种常见方法 2016年08月17日 22:36:59 阅读数:37936 在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长.今天大众好像更倾向于用"网络数据采集",有时会把网络数据采集程序称为网络机器人(bots).最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用HTML表单或其他网页文件),然后对数据进行解析,提取需要的信息. 本文假定读者已经了解如何用代码来抓取一个远程的URL,并具备表单如何提交及JavaScrip

对几种常见设计模式的理解

 转自:  http://blog.csdn.net/dengpeng0419/article/details/48110841 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 最早提出"设计模式"概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现.在<建

Oracle的硬解析和软解析

提到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程.当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:1.语法检查(syntax check)检查此sql的拼写是否语法.2.语义检查(semantic check)诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限.3.对sql语句进行解析(prase)利用内部算法对sql进行解析,生成解析树(parse tree

java之 ------ 几种常见的简单设计模式

前言: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.用于解决特定环境下.重复出现的特定问题的解决方案.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的