SQL优化观看方法见最后:
1、推导IO响应时间(随机读)
服务器的硬盘一般都是15000转/分钟,它的io响应时间量化如下:
15000转/60秒
=60秒/15000转 (分子分母换下位置)
=1秒/2500转
=0.0004秒/转
可以得出结论IO响应时间是4毫秒,换句话说你的磁盘转一圈花费4毫秒肯定能找到你需要的数据(随机读)。
2、推导硬盘的iops
每秒支持的io个数的上限:
1秒=1000毫秒,io随机读的响应是4ms,意思就是花费4ms一个io,那一秒钟最多可以有1000/4=250个IO.那这个15000转的硬盘的IOPS就是250
3、磁盘最大的吞吐量
磁盘的吞吐量是由磁盘接口决定的,比如SATA,SAS接口
思考问题1:为啥操作系统iostat 命令显示,磁盘只有2mb/s,磁盘就100%busy了,是否意味着磁盘有性能问题呢?
.................
.................
.................
####IO 是如何被读取的!
对于磁盘而言,你需要告诉磁盘你从哪个块开始读(start_offset),读几个块:
pread(文件号,start_offset,size)
1>对于数据库而已,每个block是8192,有个数据文件文件号是1,你需要从block id=2(编号0,1,2)开始读,读1个block(单块读)。它对应的命令就是:
pread(1,2*8192,8192).
数据库的读写在操作系统层大部分都是随机读和随机写
2>对于操作系统而已,IO寻址方式有:
随机读 ---数据位置相差大,比如第一个是block id 1,第二个是block id是2000
随机写
顺序读 ---数据位置相邻,比如block id 1和block id 2的读取
顺序写
------回归刚才那个问题
思考问题1:为啥操作系统iostat 命令显示,磁盘只有2mb/s,磁盘就100%busy了,是否意味着磁盘有性能问题呢?
=1》如果单块读:一次读取一个block,,一个block 8k,它一秒钟读取了250次,那它这一秒读取的大小是250*8K=2000K=2M,这是由于达到iops上限,所以iostat看到磁盘是100% busy了,是否意味着磁盘有性能问题呢?
=2》如果多块读,一次读取128个block=1M,它一秒钟读取了250次,那这一秒的速度是250M/s
所以IO读速度取决于每次IO读取的block数
思考问题2:一条update语句执行过程中涉及的IO类型
1>客户端发出update语句 set id=5 where id=3
2>前台进程判断id=3的数据在不在内存中,不在就将硬盘中的数据随机读取到内存-buffer cache中
3>在共享内存中把id=3修改成5, 改之前把前镜像写入undo,commit后把log buffer (记录undo和data file的修改日志) 通过LGWR进程以顺序的方式写入到redo log
4> DBWR 进程 异步把脏数据随机写入磁盘
------------------SQL观看方法--------:
-----------------------------------------------
本人淘宝店铺,欢迎咨询:
oracle 经营范围: | ||
1、单机安装 | 2、rac安装 | 3、dataguard 配置 |
4、备份恢复 | 5、漏洞修复 | 6、GoldenGate安装 |
7、数据迁移 | 8、版本升级 | 9、问题咨询 |
https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debPYFG5q&ft=t&id=608457389678