sql - postgreSQL 中的共享命中缓存

标签 sql postgresql caching

我正在试验 EXPLAIN 命令并试图找出共享命中是什么。

Seq Scan on foo  (cost=0.00..18334.00 rows=1000000 width=37) (actual time=0.030..90.500 rows=1000000 loops=1)
  Buffers: shared hit=512 read=7822
Total runtime: 116.080 ms

我注意到我们拥有的共享命中数越多,执行查询的速度就越快。但那是什么?据我所知,shared read 只是从物理存储中读取,例如 RAIDSSD。但为什么 shared hit 更快?它是存储在 RAM 中还是存储在何处?

最佳答案

shared hit 本质上是指该值已经缓存在计算机的主内存中,无需从硬盘读取。

访问主内存 (RAM) 比从硬盘读取值快。这就是为什么查询速度越快的原因。

启动 Postgres 后,主内存 (RAM) 中没有可用数据,所有数据都需要从硬盘读取。

从执行计划考虑这一步:

  ->  Seq Scan on products.product_price  (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.053..103.958 rows=392273 loops=1)
        Output: product_id, valid_from, valid_to, price
        Buffers: shared read=2818
        I/O Timings: read=48.382

“缓冲区:共享读取=2818”部分意味着必须从硬盘读取 2818 个 block (每个 8k)(耗时 48 毫秒 - 我有一个 SSD)。这 2818 个 block 存储在缓存中(“shared buffers”),以便下次需要它们时,数据库不需要(再次)从(慢速)硬盘读取它们。

当我重新运行该语句时,计划更改为:

  ->  Seq Scan on products.product_price  (cost=0.00..3210.27 rows=392273 width=0) (actual time=0.012..45.690 rows=392273 loops=1)
        Output: product_id, valid_from, valid_to, price
        Buffers: shared hit=2818

这意味着前面语句的那2818个 block 还在主存(=RAM)中,Postgres不需要从硬盘中读取它们。

“内存”始终指的是内置于计算机中并可供 CPU 直接访问的主内存 (RAM),而不是“外部存储”。

关于 Postgres 如何管理共享缓冲区有几个介绍:

关于sql - postgreSQL 中的共享命中缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907377/

相关文章:

sql - Postgres 慢速限制查询

c# - Ncache的Web.Cache和ObjectCacheProvider的区别

sql - SQL —在SELECT中创建列以测试是否相等

mysql - 表格设计建议

postgresql - Sequelize 验证电子邮件,失败并返回空字符串

javascript - 加载后: check if an image is in the browser cache

c++ - 分析指令缓存未命中

sql - IF THEN 在存储过程中循环

sql - 使用窗口函数和过滤器 PostgreSQL 按时间条件计算移动和/计数

postgresql - 如何将Docker内部的Spring Boot应用程序连接到外部PostgreSQL