KingbaseES 逻辑读与物理读
oracle数据库中逻辑读,物理读
数据访问方式:数据库少不了和操作系统进行数据交互,表数据最好的方式是从数据库共享池中访问到,避免发生磁盘IO,当然如果共享池中没有访问到数据就难免发生磁盘IO。
物理读:从磁盘读取数据到buffer cache,消耗磁盘io,一般是全表扫描导致,这种情况就尽量用到索引减少数据访问以降低io。
逻辑读:通过从数据库buffer cache中获取数据(包含物理读),分为当前读和一致性读,当前读获取数据块的最新版本,进程会给读取的块加锁,一致性读读取是块的最新版本或者回滚段中的历史版本,不需要加锁。逻辑读消耗cpu。
直接路径读:从磁盘读取数据绕过buffer cache,直接读取到pga,通常是由于大表全表扫描或使用并行导致,oracle 11g 新特性,好处是能降低buffer cache争用,坏处是大量io消耗,
说明:KES数据库中不存在直接路径读的概念,那么针对物理读,和逻辑读和oracle中的定义也略有区别,下面看一下KES中逻辑读,物理读是如何定义的。
KInbgaseESV8R6中逻辑读,物理读
sys_stat_statements视图可以查看数据库性能的关键指标,以下是有关计算物理读,逻辑读的关键字段及其含义。
shared_blks_hit shared_buffer中的命中块数
shared_blks_read shared_buffer中未命中,从操作系统缓冲读进shared_buffer的块数,如果操作系统缓存中没有有关记录,则需要读取数据文件而发生物理磁盘IO,此过程理解为发生物理读。
shared_blks_dirtied shared_buffer中弄脏的总块数
shared_blks_written 从shared_buffer中写入的总块数,这里指从shared_buffer写入了操作系统缓存或写入数据文件而发生物理磁盘IO,此过程理解为发生物理写。
local_blks_hit 本地块缓冲命中总数,指temp_buffers中命中块数
local_blks_read 本地块缓冲未命中,从操作系统缓冲读进temp_buffer的块数,如果操作系统缓冲区没有找到,有可能发生物理IO,此过程理解为发生物理读
local_blks_dirtied temp_buffers中产生的脏块数
local_blks_written 从temp_buffers写入临时表,同理,此过程理解为发生物理写。
temp_blks_read 从临时文件temp_file读取到work_mem的块数,此过程理解为发生物理读。
temp_blks_written 从work_mem写入 temp_file总块数,发生物理io,此过程理解为发生物理写。
blocks 都是物理磁盘块在内存里的映射
shared blocks:共享数据库块,shared_buffers 上分配的数据块,各关系表都是从磁盘文件加载到shared-buffer后才能读写。
local blocks:临时表等只有本会话可以使用的数据块,别的会话看不到。
temp blocks: SQL 语句执行过程中,排序、Hash等操作需要的work_mem,maintance_work_mem 不够,使用磁盘文件排序、Hash等,这些临时文件对应的就是临时块,本会话可见。
4 种数据访问方式:
Hit:读数据页的时候,直接在 shared/local blocks 命中,没有发生磁盘 IO
dirty:写数据的时候,写入了 shared/local 数据库块,还没有发生磁盘 IO
read:物理读
written:物理写
注意区别于oracle的物理读,物理写,KES数据库包括了操作系统缓存信息,而尽管read,written这时候不一定会发生物理磁盘IO。所以与oracle中的物理读略有区别,oracle数据库中不考虑操作系统缓存。
temp blocks 只有 read/written 操作。没有数据库实例内的缓存。
对于逻辑读,物理读,kwr中的体现如图:
物理写:writte
逻辑读:hit
物理读:read
此部分展示了几个内存区域发生了物理IO,也就是sql没有在数据库内存区域找到对应数据,需要和操作系统进行交互。
也可以从设备上看到主机IO每秒写入/读取大小等指标判断物理读写对于磁盘的消耗。
KWR报告中的TOP SQL内容还展示了,可以据此查到消耗IO性能的sql,具体内容略过不展示。