gpt4 book ai didi

sql - postgreSQL 中的共享命中缓存

转载 作者:行者123 更新时间:2023-11-29 11:14:44 26 4
gpt4 key购买 nike

我正在试验 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com