请问一下pg_stat_statements中的local_blks_hit、local_blks_dirtied怎么理解?官方手册解释Total number of local block cache hits by the statement。什么是local block?
在PostgreSQL中,local_blks_hit和local_blks_dirtied是pg_stat_statements模块中用于统计SQL语句性能指标的两个参数。其中,local_blks_hit表示SQL语句在本地缓存中命中的块数,local_blks_dirtied表示SQL语句在本地缓存中被修改的块数。
在PostgreSQL中,local block是指在共享缓存中的一个块,大小通常为8KB,用于存储表中的数据页或索引页。当使用SQL语句查询或更新表中的数据时,PostgreSQL会将需要访问的数据页或索引页加载到本地缓存中,以提高访问速度和效率。
local_blks_hit表示SQL语句在本地缓存中命中的块数,也就是说,这些块已经在本地缓存中存在,不需要从磁盘中加载。因此,local_blks_hit越高,表示SQL语句在本地缓存中的命中率越高,访问速度和效率也越高。
local_blks_dirtied表示SQL语句在本地缓存中被修改的块数,也就是说,这些块已经被SQL语句所修改,需要将其写回到磁盘中。因此,local_blks_dirtied越高,表示SQL语句对本地缓存的修改越多,需要写回磁盘的数据量也越大。
local_blks_hit:该指标表示SQL语句在执行过程中从本地块缓存(local block cache)中获取的块数。换句话说,它记录了SQL语句读取的块数,其中块已经存在于缓存中,无需从磁盘读取。这意味着对于local_blks_hit越高的SQL语句来说,读取的数据越多是直接从缓存中获取的,而不需要进行磁盘I/O操作,因此查询性能会更好。
local_blks_dirtied:该指标表示SQL语句在执行过程中修改或脏兆的块数。当SQL语句对块进行更新时,即使块仍然在缓存中,它们也被标记为"脏",表示需要将数据同步到磁盘以保证数据的一致性。因此,local_blks_dirtied记录了由SQL语句修改或脏兆的块数,即该语句导致了磁盘I/O操作的次数。
local_blks_hit:表示该用户或会话的 SQL 语句对本地缓存的命中次数。如果一个 SQL 语句需要访问的数据已经在本地缓存中,则该 SQL 语句对本地缓存的命中次数为1。如果一个 SQL 语句需要访问的数据不在本地缓存中,则该 SQL 语句对本地缓存的命中次数为0。
local_blks_dirtied:表示该用户或会话的 SQL 语句对本地缓存的污染次数。如果一个 SQL 语句需要访问的数据已经在本地缓存中,则该 SQL 语句对本地缓存的污染次数为1。如果一个 SQL 语句需要访问的数据不在本地缓存中,则该 SQL 语句对本地缓存的污染次数为0。
在PostgreSQL中,每个数据库连接都有一个本地块缓存(local block cache),用于存储从磁盘读取的数据块。当查询执行时,PostgreSQL会尽可能地将需要的数据块加载到本地块缓存中,以减少对磁盘的读取操作,从而提高查询性能。
pg_stat_statements
是一个用于跟踪查询统计信息的扩展模块,其中的local_blks_hit
和local_blks_dirtied
是与本地块缓存相关的统计指标。
local_blks_hit
表示通过本地块缓存获取数据块的次数。当查询需要的数据块已经在本地块缓存中时,查询可以直接从缓存中获取数据,而不需要进行磁盘读取操作。每次成功从本地块缓存中获取数据块时,local_blks_hit
就会增加。
local_blks_dirtied
表示由于查询的修改操作(如更新或删除)而导致本地块缓存中的数据块被修改的次数。当查询对本地块缓存中的数据块进行修改时,会将修改后的数据块标记为"脏块"(dirty block),表示需要将其写回磁盘。每次对本地块缓存中的数据块进行修改时,local_blks_dirtied
就会增加。
通过监视和分析这两个统计指标,可以了解查询在访问本地块缓存方面的效率和性能。较高的local_blks_hit
值表示查询能够有效地利用本地块缓存,减少磁盘读取操作,而较高的local_blks_dirtied
值可能意味着查询执行了大量的修改操作,需要频繁地将数据块写回磁盘。
在 PostgreSQL 中,pg_stat_statements 是一个系统视图,用于提供有关执行过的SQL语句的统计信息。其中 local_blks_hit 和 local_blks_dirtied 是其中两个字段,分别表示SQL语句对本地块缓存的命中次数和脏块(已修改但未写回磁盘的缓存块)次数。
local_blks_hit:这个字段表示SQL语句在执行过程中从本地块缓存中成功命中的次数。当SQL语句需要读取数据块时,如果该数据块已经在本地块缓存中,那么就可以直接从缓存中读取,而不需要从磁盘中读取。local_blks_hit 记录了这种缓存命中的次数。
local_blks_dirtied:这个字段表示SQL语句在执行过程中对本地块缓存进行了修改但还未写回磁盘的次数。当SQL语句需要更新数据块时,会先将数据块读取到本地块缓存中,然后在缓存中进行修改。如果在修改数据块后,该数据块的内容还没有写回到磁盘,那么就称为脏块。local_blks_dirtied 记录了这种脏块产生的次数。
总结:
本地块缓存是 PostgreSQL 中的一种缓存机制,用于加速数据的读取和写入操作。通过增加缓存命中率和减少脏块的产生,可以有效提高数据库的性能和响应速度。
在PostgreSQL中,pg_stat_statements
是一个统计扩展模块,用于收集和跟踪SQL语句的执行统计信息。其中,local_blks_hit
和local_blks_dirtied
是两个与缓存(block cache)相关的指标。
local_blks_hit
表示SQL语句从本地块缓存中获取(hit)的块数量。这意味着查询使用了已经存在于缓存中的数据块,而不需要从磁盘读取新的数据块。较高的local_blks_hit
值通常表示查询性能良好,因为它减少了对磁盘I/O的需求。
local_blks_dirtied
表示由SQL语句修改(dirtied)的本地块数量。当查询更新或插入数据时,可能会修改缓存中的数据块,以便将更改写回磁盘。local_blks_dirtied
记录了被修改的块数。较高的local_blks_dirtied
值可能表明查询执行了大量的写操作。
"Local block"(本地块)是指PostgreSQL中用于存储数据的基本单位。数据在磁盘上按块进行组织,在内存中也以块的形式进行缓存。每个块通常包含多个行或元组。当查询执行时,PostgreSQL会通过读取和修改块来访问和更新数据。
在pg_stat_statements中,local_blks_hit表示语句通过本地块缓存(即共享缓冲区)命中的次数,而local_blks_dirtied表示语句在本地块缓存中脏块的数量。
本地块是指存储在共享缓冲区中的数据块。共享缓冲区是PostgreSQL用于缓存磁盘上的数据块的内存区域。当查询需要读取数据时,PostgreSQL会首先检查共享缓冲区中是否存在所需的数据块,如果存在则表示命中,即local_blks_hit增加;如果不存在,则需要从磁盘上读取数据块,并将其加载到共享缓冲区中,此时表示未命中。
而local_blks_dirtied表示在执行语句时,如果对本地块进行了修改(即脏块),则会增加该计数器。这意味着语句对数据进行了更新或插入操作,导致相关的块在内存中变为脏块,需要后续将其写回磁盘。
总之,local_blks_hit表示语句通过本地块缓存命中的次数,而local_blks_dirtied表示语句在本地块缓存中脏块的数量。这两个统计指标可以帮助我们分析查询语句的性能和对共享缓冲区的利用情况。
在 PostgreSQL 中,pg_stat_statements 是一个扩展模块,用于收集并提供关于 SQL 语句执行性能的统计信息。其中,local_blks_hit 和 local_blks_dirtied 是 pg_stat_statements 模块中的两个统计指标。
local_blks_hit
:表示语句执行期间从本地磁盘块缓存(或称为共享缓冲区)中直接获取的块数量。当查询或语句需要读取某个表或索引的块时,PostgreSQL 会首先检查本地缓冲区中是否存在该块的副本。如果存在,则不必从磁盘读取,而是直接从缓冲区获取(命中)。每次成功的缓冲区命中都会增加 local_blks_hit
的值。
local_blks_dirtied
:表示语句执行期间修改了本地磁盘块缓存(或称为共享缓冲区)中的块数量。当查询或语句修改某个表或索引的块时,PostgreSQL 会将这些修改后的块标记为"脏块",即需要在适当的时间写回到磁盘。每次修改缓冲区块(将原始块标记为脏块)都会增加 local_blks_dirtied
的值。
总结来说,local_blks_hit
表示语句在执行过程中直接从本地缓存中获取的块数量,而 local_blks_dirtied
表示语句在执行过程中修改了本地缓存的块数量。这些统计指标可以帮助分析查询性能以及对数据库缓冲区的使用情况。
参考:https://dba.stackexchange.com/questions/201602/what-is-local-block-in-pg-stat-statements
此答案来自钉钉群“PG|POLARDB技术进阶"
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 是阿里云自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。