我正在试验 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
只是从物理存储中读取,例如 RAID
或 SSD
。但为什么 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/