oracle SQL 优化之量化IO速度 笔记

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 SQL 优化之量化IO速度 笔记

 

 

-----------------------------------------------

本人淘宝店铺,欢迎咨询:

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

    

   

上一篇:HBase 特性简要分析


下一篇:Android版kotlin协程入门(四):kotlin协程开发实战