回答

收藏

PostgreSQL共享命中缓存

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

我正在尝试EXPLAIN命令,试图找出它是什么shared hit。
9 b# s1 e' j1 t  p$ hSeq 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还是在哪里?7 ^& U% b" j7 l' t( o4 U' l+ [
                                                               
! a+ T# p; u) }' C. Z6 S    解决方案:                                                                % J! T# `# N  b$ Z/ d
                                                                shared hit 本质上意味着该值已经缓存在计算机的主存储器中,而无需从硬盘读取该值。: A) y8 F# H* n7 c# r
访问主内存(RAM)     速度比硬盘读取要快得多。这就是为什么点击次数越多,查询速度越快。
; o# h! Q& G) o5 J6 a) S% R启动Postgres后,主内存(RAM)没有可用的数据,所有内容都需要从硬盘上读取。6 A- m) U' {7 ~3 F; Y
考虑执行计划中的步骤:
4 e6 Y! q7 c8 Z        ->  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-
6 {/ E" M7 ]0 ?7 A" V我有一个SSD)。这2818块存储在高速缓存(共享缓冲区)中,因此数据库不需要(再次)从(慢速)硬盘读取它们。
: y# \' |: \$ l* R' Z当我重新运行这个句子时,计划改为:! a! W$ `7 _( L) w  _& S/ H0 X4 g
        ->  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则不需要从硬盘读取它们。& D: U7 m7 e: F" j! h
内存总是指计算机内置,可以直接通过CPU访问的主内存(RAM),而不是外部存储。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则