PostgreSQL 数据读取快慢,你有做主的权利

2023-10-28 14:10

本文主要是介绍PostgreSQL 数据读取快慢,你有做主的权利,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PostgreSQL使用shared_buffers来缓存内存中的块。其思想是减少磁盘I/O并以最有效的方式加速数据库。在正常操作期间,数据库缓存将非常有用,并确保良好的响应时间。但是,如果由于某种原因重新启动数据库实例,会发生什么情况呢?你的PostgreSQL数据库性能将受到影响,直到你的I/O缓存再次填满。这需要一些时间,而且可能会严重影响查询响应时间。

在PostgreSQL 11中,一个新的autoprewarm功能被添加到contrib模块pg_prewarm中。这将使用在最后一次服务器重新启动之前持有的相同页面自动温暖共享缓冲区。为了实现这一点,Postgres现在有一个后台工作程序来定期记录文件中共享缓冲区的内容——“autoprewarm.blocks”。接下来,它将在服务器重启后重新加载这些页面。

PostgreSQL可以通过 pg_prewarm 的方式来提供预热缓冲的作用,pg_prewam 提供两种功能,手动缓冲和自动缓冲。

如何安装pg_prewarm及autoprewarm,以下基于pg 11 版本,在PG11中如果你编译安装则默认的pg_prewarm 会被安装到PG 中,确切地说,“autoprewarm master”将定期在文件“$PGDATA/autoprewarm.blocks”中记录共享缓冲区中的页面信息。更新“autoprewarm”的频率。块”由配置参数pg_prewarm_autoprewarm_interval决定。一旦服务器重新启动,主服务器将读取“autoprewarm”。块”,并排序要预热的页面列表。接下来,它将每次为每个数据库启动一个worker。然后,每个数据库工作程序(即autoprewarm工作程序)将加载属于其数据库的页面。

安装只需要两步

1 需要在 shared_preload_libraries 中添加

在这里插入图片描述

当然你也可以执行下面的命令

alter system set shared_preload_libraries = ‘pg_prewarm’;

从启动服务器后,可以看到 autoprewarm master 的这个线程

在这里插入图片描述

并且在数据目录可以看到新生成的文件

在这里插入图片描述

2 在你的数据库中执行(与预热无关)

create extension pg_prewarm;

装载你的扩展

在做完这些我们做一个测试,我们在打开的预热的机器上,进行分析查询

可以看到第二次已经走 cache了

在这里插入图片描述

我们关闭postgresql 再从重启动PG ,再次运行,看到图中查询已经走了cache

在这里插入图片描述

如果我们关闭数据库,在关闭期间将autoprewarm.blocks删除后,在重新启动PG 我们看看结果如何
在这里插入图片描述

很明确的看到查询中没有走缓冲。

那文件到底存储了什么

第一行表示页面的总数,后面的每一行表示关于页面的信息。每个页面都由数据库oid、表空间oid、关系的relfilenode、fork文件号和块号惟一地表示。

在这里插入图片描述

我们可以看一下系统中的 pg_prewarm函数,在PG 中国函数是使用C语言撰写的,当然如果用C语言来写 PG 的函数,效率是很高的。

CREATE OR REPLACE FUNCTION public.pg_prewarm(

regclass,mode text DEFAULT 'buffer'::text,fork text DEFAULT 'main'::text,first_block bigint DEFAULT NULL::bigint,last_block bigint DEFAULT NULL::bigint)RETURNS bigintLANGUAGE 'c'COST 1VOLATILE PARALLEL SAFE

AS ‘$libdir/pg_prewarm’, ‘pg_prewarm’

;

其中会将四个参数传递给函数 1 将prewarm表名传递,2 prewarm 的模式 3第三个参数表的fork类型,最后最后两个是开始和结束的block number

我们会进行以下测试,看在不同的模式下,如果数据上送到缓冲中的速度的提升,以及不同模式有什么差异。

在这里插入图片描述

上面是一个单表1.3G 的SIZE 的表。

下面我们需要对这个表进行一个整体的 COUNT 运算,我们来看看使用缓冲和不使用有什么区别

1 我们可以先裸奔一下,1.3G 大小的表进行COUNT运算时,整体的速度在不到2秒可以给出结果(I am sorry, 我的I/O 系统是 SSD)

在这里插入图片描述

2 我们将数据进行预读

select pg_prewarm(‘bloom_table’,‘read’,‘main’);

在这里插入图片描述

3 我们将模式调整为 buffer 模式

explain analyze select count(*) from bloom_table;

在这里插入图片描述

4 最后我们使用 prefetch 模式,异步的方式进行预读

在这里插入图片描述

基本上这三种方式没有特别大的差别,但实际上 read 为使用OS 系统缓冲的模式,buffer使用 postgresql 的buffer 模式, prefetch 为异步读取数据模式。另一个需要注意的地方,就是大表的读取到缓冲中与大表直接指向语句是不一样的,如果你认为仅仅通过select * from table 的方式就能将数据读入到缓冲,postgresql 是不会允许这样的事情发生的,一般这样的操作仅仅是能将很少一部分数据预读进缓冲。当然如果你的内存比较小的情况,你要注意这个问题,突然将一个大表读入缓冲带来的问题,可能是将正在使用的数据从你的buffer 中 挤出,这可不是什么好的操作。

这篇关于PostgreSQL 数据读取快慢,你有做主的权利的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293733

相关文章

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转