Oracle 数据库中逻辑读和物理读

数据访问方式:数据库少不了和操作系统进行数据交互,表数据最好的方式是从数据库共享池中访问到,避免发生磁盘 IO,当然如果共享池中没有访问到数据就难免发生磁盘 IO。
物理读:从磁盘读取数据到 buffer cache,消耗磁盘 io,一般是全表扫描导致,这种情况就尽量用到索引减少数据访问以降低 io。
逻辑读:通过从数据库 buffer cache 中获取数据(包含物理读),分为当前读和一致性读,当前读获取数据块的最新版本,进程会给读取的块加锁,一致性读读取是块的最新版本或者回滚段中的历史版本,不需要加锁。逻辑读消耗 cpu。
直接路径读: 从磁盘读取数据绕过 buffer cache,直接读取到 pga,通常是由于大表全表扫描或使用并行导致,oracle 11g 新特性,好处是能降低 buffer cache 争用,坏处是大量 io 消耗,
说明:KES 数据库中不存在直接路径读的概念,那么针对物理读,和逻辑读和 oracle 中的定义也略有区别,下面看一下 KES 中逻辑读,物理读是如何定义的。
KingbaseES V8R6 中逻辑读和物理读
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,具体内容略过不展示。
按 I/O 时间排序的 SQL 语句
按逻辑读块数排序的 SQL 语句
按物理读块数排序的 SQL 语句
按物理写块数排序的 SQL 语句 更多信息,参见 https://help.kingbase.com.cn/v8/index.html
Oracle 数据库中逻辑读和物理读
数据访问方式:数据库少不了和操作系统进行数据交互,表数据最好的方式是从数据库共享池中访问到,避免发生磁盘 IO,当然如果共享池中没有访问到数据就难免发生磁盘 IO。
物理读:从磁盘读取数据到 buffer cache,消耗磁盘 io,一般是全表扫描导致,这种情况就尽量用到索引减少数据访问以降低 io。
逻辑读:通过从数据库 buffer cache 中获取数据(包含物理读),分为当前读和一致性读,当前读获取数据块的最新版本,进程会给读取的块加锁,一致性读读取是块的最新版本或者回滚段中的历史版本,不需要加锁。逻辑读消耗 cpu。
直接路径读: 从磁盘读取数据绕过 buffer cache,直接读取到 pga,通常是由于大表全表扫描或使用并行导致,oracle 11g 新特性,好处是能降低 buffer cache 争用,坏处是大量 io 消耗,
说明:KES 数据库中不存在直接路径读的概念,那么针对物理读,和逻辑读和 oracle 中的定义也略有区别,下面看一下 KES 中逻辑读,物理读是如何定义的。
KingbaseES V8R6 中逻辑读和物理读
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,具体内容略过不展示。
按 I/O 时间排序的 SQL 语句
按逻辑读块数排序的 SQL 语句
按物理读块数排序的 SQL 语句
按物理写块数排序的 SQL 语句




