X

Author Profile

Bin Mao

Recent Posts by Bin Mao

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

       经常有客户提SR说某个SQL的执行计划变差了,导致出现了性能问题,进而就问为啥解析出了新的 执行计划。首先可以肯定突然出现了新的执行计划表明sql进行了重新硬解析(注意重新硬解析不一定 产生新的执行计划),那么为啥好好的sql需要重新硬解析呢?今天我们就列举几种常见的原因:   1.自动收集统计信息  为了保证sql的最佳执行性能,oracle需要找到一个最优的执行计划,基于CBO模式的优化器必须 要知道最新的统计信息,例如条数,block数量,某个字段的选择率等,所以oracle每天凌晨都会运行一 个自动收集统计信息的job,来收集那些变化超过10%的表的最新统计信息,收集完成之后,理所当然 要对新来的sql进行使用,所以就需要进行硬解析。oracle 收集某个表统计信息后默认是不会立即invalid 所有相关的cursor,因为这样做太暴力,会引发硬解析相关的性能问题,所以巧妙的设计了一下,当某个相关sql执行的时候发现一个依赖对象最近收集过统计信息,便随机的打个一个时间戳,这个时间戳是 5个小时内某个时间戳,等到下次sql解析的时候若是发现了这个...

一个connect by 应用的case

最近处理了一个connect by的case,分享给大家一下。 首先介绍一下connect by作用:对于数据有着严密的层级关系的表,我们有时候希望能够把有着 父子关系或者叫上下级关系的数据一次性展现出来,这个时候传统的sql 语法并不能就解决问题, 例如一个部门有一个总经理,多个副经理,每个下面又有多个总监,总监下面是员工, 我们设计表的时候,肯定只有一个字段来记录员工的上级,并不会记录他的上上级,那么我们 想把某个副经理的下面的所有员工都列出来的时候,就存在递归查找底层员工的情况,这种 就需要用到递归遍历,不同的DB给出了不同的解决办法,如DB2可以使用with+内嵌递归逻辑的 sql实现,oracle 提供了connect by的语法来实现。下面简单的看个例子: drop table emp; create table emp( emp_no number , manager_no number, name varchar2(100)); insert into emp values(1,,'总经理'); insert into emp...

如何在asm上定位数据块

我们都知道当db使用传统的文件系统时,定位block是就是通过dba_extents 中的blockid即可,然后 通过bbed或dd 直接操作对应数据文件的相应block即可,从10g开始,oracle使用ASM来管理磁盘, 因为所有数据文件都在ASM上,所以传统的bbed,dd都不能直接访问新型"文件系统"上的某个数据文件了 当我们需要在特殊场景下修改某个block的内存的时候该怎么办呢?下面给您演示一下: 首先我在这里先普及一下ASM的一点基础知识,需要知道的是ASM在磁盘上存储数据,分配的时候都是AU(allocation unit)为单位的,默认情况AU是1M,所以一个2G的数据文件 需要至少分配2×1024=2048个AU,当然存储这些AU的相关信息(如编号)也是需要存储空间的,这种元数据也是需要占用AU的,所以 实际上从ASM层面来看分配给某个数据文件的au数量要高于它的需求数量。对于ASM来讲,数据库的所有文件,如控制文件,spfile,数据文件都是作为一种叫文件目录(file directory)类型的数据进行管理的。每一条这种...