oracle 物理读突然增加的原因_请教一个诡异的物理读比逻辑读还多的问题!!!!
本帖最后由 wxjzqym 于 2012-6-1 10:27 编辑
为了更好的理解物理读和逻辑读的关系,模拟了以下实验:(DB 10.2.0.1.0 32bit)
1.在scott用户下创建测试表和相关索引
create table tl(id int,name varchar2(100));
begin ... end;(使用存储过程向表中插入1000条记录)
create index tl_idx on tl(id);(在id字段上创建一个b-tree索引)
2.第一次执行该sql(这是为了去掉recursive calls 对实验的影响)
select * from tl where id=1;
3.在sys用户下刷新buffer cache中的block(这是为了当再次执行sql时发生物理读)
alter system flush buffer cache;
4.在scott用户下再次执行sql(同时打开autotrace以观察执行计划和统计信息)
set autot on
select * from tl where id=1;
ID NAME
---------- ----------
1
执行计划
----------------------------------------------------------
Plan hash value: 4160527729
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 3 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TL | 1 | 3 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TL_IDX | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ID"=1)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
16 physical reads
0 redo size
460 bytes sent via SQL*Net to client
384 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
从以上结果发现该sql消耗了16个物理读和4个逻辑读,在这里我就疑惑了,为什么物理读的个数会超过逻辑读?
以我的理解,在没有发生直接路径访问的情况下,每个物理读都会被读入buffer cache中,所以应该一个物理读就会对应一个逻辑读啊。
怀疑可能是autotrace显示信息不够正确。于是再次模拟这个实验,这次与上次稍微不同,在第4步时没有开启autotrace的功能
而是用10046 trace代替。可结果依然是16个物理读+4个逻辑读,且sql执行过程中的等待事件为db file scatter read,
这里又不理解了,为什么走索引时却发生了这个等待事件,10046 trace内容如下:
=====================
PARSING IN CURSOR #4 len=28 dep=0 uid=65 oct=3 lid=65 tim=5977017214 hv=1673619045 ad='334be8ac'
select * from tl where id=99
END OF STMT
PARSE #4:c=0,e=654,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=5977017211
BINDS #4:
EXEC #4:c=0,e=363,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=5977045113
WAIT #4: nam='SQL*Net message to client' ela= 3 driver id=1111838976 #bytes=1 p3=0 obj#=-1 tim=5977045461
WAIT #4: nam='db file scattered read' ela= 19511 file#=4 block#=73 blocks=8 obj#=55362 tim=5977065349
WAIT #4: nam='db file scattered read' ela= 5828 file#=4 block#=65 blocks=8 obj#=55361 tim=5977071666
FETCH #4:c=0,e=26416,p=16,cr=3,cu=0,mis=0,r=1,dep=0,og=1,tim=5977072214
WAIT #4: nam='SQL*Net message from client' ela= 147 driver id=1111838976 #bytes=1 p3=0 obj#=55361 tim=5977072758
FETCH,tim=5977 #4:c=0,e=12,p=0,cr=1,cu=0,mis=0,r=0,dep=0,og=1073123
WAIT #4: nam='SQL*Net message to client' ela= 2 driver id=1111838976 #bytes=1 p3=0 obj#=55361 tim=5977073500
WAIT #4: nam='SQL*Net message from client' ela= 844 driver id=1111838976 #bytes=1 p3=0 obj#=55361 tim=5977074674
STAT #4 id=1 cnt=1 pid=0 pos=1 obj=55361 op='TABLE ACCESS BY INDEX ROWID TL (cr=4 pr=16 pw=0 time=26411 us)'
STAT #4 id=2 cnt=1 pid=1 pos=1 obj=55362 op='INDEX RANGE SCAN TL_IDX (cr=3 pr=8 pw=0 time=20023 us)'
WAIT #0: nam='SQL*Net message to client' ela= 1 driver id=1111838976 #bytes=1 p3=0 obj#=55361 tim=5977076054
从10046来看,发生了两次离散读,且每次都消耗了8个物理读,正好符合统计的数字,而文件号4的65和73正好是表和索引的位图块。
SQL> select extent_id,block_id,blocks from dba_extents where segment_name='TL' and owner='SCOTT';
EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 65 8
SQL> select extent_id,block_id,blocks from dba_extents where segment_name='TL_IDX' and owner='SCOTT';
EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 73 8
总的来说就是两个问题困扰着我:
1.以上执行的sql中为什么物理读大于逻辑读
2.执行计划中的index range scan为什么会发生db file scatter read等待事件
希望各位能够给予我解答,万分感谢!
oracle 物理读突然增加的原因_请教一个诡异的物理读比逻辑读还多的问题!!!!相关推荐
- 电源空间辐射CDN余量低_请教一个EMI问题:CE传导辐射在射频工作频点超标,求解决。...
请教一个EMI问题:CE传导辐射在射频工作频点超标,求解决. budaqiu Post at 2011/10/10 11:37:28 大侠们,做EMC认证时,空间辐射RE通过,传导辐射CE发现在射频工 ...
- mysql怎么判断2个时间戳为同一天_请教一个需求js怎么判断时间戳是否属于同一天...
思路就是把history数组处理成一个相同日期是在同一个数组成员内,再调整一下 addHisList 函数就可以 demo 链接:https://codepen.io/liangxh052... fu ...
- 常数乘以无穷大等于多少_请教一个数学问题:无穷大乘以无穷小等于多少?
实在受不了了,只好出来说两句.好歹也是数学这一行的,看她被你们 糟蹋成这样实在不忍心. "无穷大量"和"无穷小量"在高等数学中都是趋于特定极限的变量的称呼, 一 ...
- php时间相减_请教一个PHP的时间戳转换成时间相减的問題?
name.php 注册用户 用户名: 姓名: 密码: 确认密码: email: 进入: tenglu 回首页 join.php $userid=$_POST['userdi']; $name=$_PO ...
- python split 倒数第一个_请教一个在python中该如何去掉split之后的第一个单词?
陪伴而非守候 123456789101112131415161718192021import re f = open('word.txt','r')word = f.read()f.close() # ...
- java 64内存不足_请教一个 Java 内存占用的问题
第 1 条附言 · 364 天前 2020-03-04 01:08:55.525 [HikariPool-1 housekeeper] WARN c.z.hikari.pool.HikariPoo ...
- python 修改列名_请教一个 Python 技巧(批量对 pandas.DataFrame()统一修改列名)
首先,我搞了个这样的事: pdTable1 = pd.DataFrame() pdTable2 = pd.DataFrame() pdTable3 = pd.DataFrame() pdTable4 ...
- jpa级联添加_请教一个JPA多对多级联保存的问题
实体类 // 标签类 @Entity public class Label { @Id @Column(name = "lid",unique = true,nullable = ...
- html5shiv 源码,javascript,_请教一个html5shiv源码插入样式的问题,javascript - phpStudy...
请教一个html5shiv源码插入样式的问题 阅读html5shiv源码的时候,对addStyleSheet函数添加样式的方式有些困惑,特来请教 源码如下: function addStyleShee ...
最新文章
- 论文翻译_论文翻译的注意事项有什么?
- 10kv电压互感器型号_电气行业需要知道的10KV电压互感器基本技术参数
- 团队—贪吃蛇—需求分析
- vue.js axios实现跨域http请求接口
- 远程登录出现 身份验证错误 要求的函数不受支持
- Mongodb入门安装
- P2P中的NAT穿越方案
- Jquery 对象求和
- matlab 叉乘变点乘,向量点乘和叉乘
- 纳睿雷达IPO过会:拟募资近10亿 包晓军夫妇为加拿大人
- 环信WebIM 发送图片消息和显示图片 发送文件和显示文件 发送表情和显示表情
- 解读Verizon 2018数据泄漏调查报告:窃取身份仍是黑客最有效的攻击手段
- 解决linux不能上外网
- 小写金额转为中文大写
- 使用yagmail模块群发工资条
- CDN防盗链与有效使用CDN缓存
- drop box java_使用Dropbox Java API将文件上载到Dropbox
- html5 声控游戏,用声音来放大招吧!10款独具创意的声控游戏
- 基于stm32单片机可燃气体温湿度监测自动通风排气系统
- 【Mac】macOS无法验证此App不包含恶意软件 解决方法