在使用openGauss数据库时,如果我们要想查看某条目标SQL语句的逻辑读和物理读,可以通过用快照生成WDR报告的方式来查看,但是这种方法比较麻烦。我通过学习WDR报告中逻辑读和物理读的生成原理,观察研究系统表,发现了一个可以单独查看这两个参数的方法,分享给大家。如有不当之处,欢迎大家指出。
一、原理
在系统表summary_statement中,针对某一特定SQL语句,我们可以通过n_blocks_fetched获取buffer的块访问次数,即缓存访问次数,通过n_blocks_hit获取buffer的块命中次数,即缓存命中次数。如果一次访问只读取一块的话,那么缓存命中次数就是逻辑读,缓存未命中次数就是物理读。如果假设成立我们可以给出以下计算方法:
n_blocks_hit = 逻辑读
n_blocks_fetchde = 逻辑读+物理读
n_blocks_fetchde - n_blocks_hit = 物理读
注: 系统表summary_statement详细内容可前往官方网站查看:Summary Statement
二、具体方法
1.用gsql工具连接openGauss数据库,然后执行一次目标SQL语句。
2.执行下面语句,获取目标SQL语句的首次执行的逻辑读和物理读。其中where条件需要根据实际情况修改。
select unique_sql_id SQL_ID,query 目标SQL语句,n_blocks_fetched 缓存访问次数,n_blocks_hit 逻辑读, n_blocks_fetched - n_blocks_hit 物理读,last_updated 日期时间 from dbe_perf.SUMMARY_STATEMENT where query like '目标查询语句' and user_name = '当前连如openGauss数据库的用户名称';
3.第二次执行目标SQL语句,并在执行完成之后再次执行2中给出的语句。
按照理论来说,目标SQL语句涉及数据较少时,第二次获取到的物理读与第一次一样,即目标SQL语句第二次执行的物理读为0,第二次获取到的逻辑读减去首次获取到的逻辑读可以得到目标SQL语句第二次执行的逻辑读,第二次及以后逻辑读和物理读的数值将会固定下来。
三、举例
1.用db_0205用户连接数据库之后,目标SQL如下。
select * from h;
2. 获取首次逻辑读和物理读。
select unique_sql_id SQL_ID,query 目标SQL语句,n_blocks_fetched 缓存访问次数,n_blocks_hit 逻辑读, n_blocks_fetched - n_blocks_hit 物理读,last_updated 日期时间 from dbe_perf.SUMMARY_STATEMENT where query like 'select * from h;' and user_name = 'db_0205';
注意:如果目标语句中有阿拉伯数字,请用%替代,否则将找不到该语句。
首次执行:逻辑读:83;物理读:155
3.第二次执行,重复步骤2。
第二次执行:逻辑读:233-83=150;物理读:155-155=0
4.第三次执行,重复步骤2。
第三次执行: 逻辑读:383-233=150;物理读:155-155=0
这套方法得出的逻辑读和物理读在数字规律上符合理论规律,因此该方法应该是可行的。但是,此方法尚未与WDR报告中的该目标SQL语句的逻辑读和物理读作比对,编者后续会抽时间对该方法做进一步验证和优化。