回答

收藏

PostgreSQL共享命中缓存

技术问答 技术问答 379 人阅读 | 0 人回复 | 2023-09-14

我正在尝试EXPLAIN命令,试图找出它是什么shared hit。
, x1 E; c; H: t' qSeq 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=7822Total runtime: 116.080 ms我注意到共享的匹配越多,我们查询的速度就越快。据我所知,sharedread它只是从诸如RAID或的物理存储中读取SSD。但是为什么shared hit更快?它存储在那里RAM还是在哪里?- v" R: B0 N) y/ P# o" x1 z
                                                               
3 P, r/ V3 T& t    解决方案:                                                               
; \' [, g; o! i0 d                                                                shared hit 本质上意味着该值已经缓存在计算机的主存储器中,而无需从硬盘读取该值。
2 H) m# @- L* m+ O8 @访问主内存(RAM)     速度比硬盘读取要快得多。这就是为什么点击次数越多,查询速度越快。2 L0 P- S5 O; u8 g6 s
启动Postgres后,主内存(RAM)没有可用的数据,所有内容都需要从硬盘上读取。
8 p2 u4 Q" w, U, }4 ]考虑执行计划中的步骤:& M: Q8 @! E5 X. L; U
        ->  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块(每8块)k)花了48美元ms-
/ k% s, N" ^+ P( o$ U0 L我有一个SSD)。这2818块存储在高速缓存(共享缓冲区)中,因此数据库不需要(再次)从(慢速)硬盘读取它们。
% k" w: Q) C' [3 y' F7 s当我重新运行这个句子时,计划改为:
" o' E% D# I) y8 S6 H* l; M        ->  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这意味着前一句话仍在主内存(= RAM)其中2818块,而Postgres则不需要从硬盘读取它们。) t, d, D7 }: Y; z+ Y% o
内存总是指计算机内置,可以直接通过CPU访问的主内存(RAM),而不是外部存储。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则