回答

收藏

PostgreSQL共享命中缓存

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

我正在尝试EXPLAIN命令,试图找出它是什么shared hit。
. p8 E  b& G* N# Q- Q" p3 xSeq 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还是在哪里?
6 w7 w# {! g0 E: D7 w                                                                , I& g5 N9 g2 V
    解决方案:                                                                / `+ K4 q+ P% B# _; w- g0 e
                                                                shared hit 本质上意味着该值已经缓存在计算机的主存储器中,而无需从硬盘读取该值。
  {, ~( \) J8 O; v9 B) T1 I' P访问主内存(RAM)     速度比硬盘读取要快得多。这就是为什么点击次数越多,查询速度越快。" H7 o# |' Y/ p; Q$ \' C+ P& K
启动Postgres后,主内存(RAM)没有可用的数据,所有内容都需要从硬盘上读取。$ |) h. ]8 D" e% a5 \* T# \
考虑执行计划中的步骤:* s/ W. g! y7 r) c/ ?: A
        ->  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-+ [0 \; n0 P% g; y5 L( \/ N
我有一个SSD)。这2818块存储在高速缓存(共享缓冲区)中,因此数据库不需要(再次)从(慢速)硬盘读取它们。
" k+ h3 O8 U5 B; u6 E: ^& j- |1 G当我重新运行这个句子时,计划改为:
+ C& A. C. C! W" ^# i3 m5 z4 z5 U: s0 i        ->  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则不需要从硬盘读取它们。
& k- ?% H0 B5 K; n0 h. o内存总是指计算机内置,可以直接通过CPU访问的主内存(RAM),而不是外部存储。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则