当前位置: 首页 > 面试题库 >

PostgreSQL中的共享命中缓存

梁巴英
2023-03-14
问题内容

我正在尝试EXPLAIN命令,并试图找出它是什么shared hit

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个块(每个8k)(并且花费了48ms-
我有一个SSD)。这些2818块存储在高速缓存(“共享缓冲区”)中,因此下次需要它们时,数据库无需(再次)从(慢速)硬盘读取它们。

当我重新运行该语句时,计划更改为:

  ->  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则不需要从硬盘读取它们。

“内存”始终是指计算机中内置的,可直接由CPU访问的主内存(RAM),而不是“外部存储”。



 类似资料:
  • 我正在使用WildFly 8.1,所以JPA 2.1和Hibernate 4.3.5 我想在WildFly中使用JPA共享缓存/二级缓存 我遵循WildFly文档:https://docs.jboss.org/author/display/WFLY8/JPA参考指南#使用InfinispanSecondlevelCache的JPA参考指南 这是我的persitience.xml: 我将属性设置为h

  • 我有两个应用程序使用相同的数据库实体。这两个应用程序都部署在jboss eap 6.2独立的集群上。DB表仅从一个应用程序中更新,但从两个应用程序中读取。这两个应用程序都使用本机hibernate API从数据库读取/写入数据。 在嵌入式模式下将infinispan启用为2LC后,如何确保在一个应用程序中更新的缓存实体从第二个应用程序缓存中失效?是否有任何JMX/JMS接口用于信号缓存失效? 若我

  • 我有一个Spring应用程序,它使用MyBatis进行持久化。我使用ehcache是因为速度对于这个应用程序很重要。我已经设置并配置了MyBatis和Ehcache。我使用一个名为“mybatis”的单一缓存,因为否则为每个实体创建单独的缓存将是荒谬的。 这是我的电子缓存。xml。 这是我的mybatis映射器界面的一个示例。 因为我有一个共享缓存,所以我需要一种方法使我的密钥对域对象是唯一的。作

  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

  • 借助 Bridge,您可以可靠地管理高速缓存,并能够在协作环境中生成共享高速缓存。使用共享驱动器时,Bridge 中的共享高速缓存机制允许您导入已生成的共享高速缓存并重用它。 注意: 在 Bridge CC 2018 及之前的版本中,高速缓存主要面向在自己的文件夹中工作的个人用户。系统会为每个用户单独生成和维护高速缓存,因此,当您在协作环境(跨网络的共享驱动器、外部硬盘驱动器)中工作时,在每个用户

  • 我将Spring缓存与CacheManager结合使用,并可在10个不同的应用程序中缓存同一表中的相同数据。实现时的假设是,我们缓存的数据是元数据,不应更改。然而,他们正在更改这些数据,缓存永远不会被清除。 现在的要求是通过2个大请求同时清除所有10个应用程序的缓存。 每当mySQL工作台上的直接INSERT语句更改表时,所有应用程序缓存都应该刷新。我使用的是Hibernate和Spring,但请