介绍 pg_later:受 Snowflake 启发的 Postgres 异步查询#postgresql认证


#PG培训#PG考试#postgresql培训#postgresql考试

为什么要使用异步查询?

想象一下,您启动了一项长期维护工作。您在执行过程中离开,但回来后发现,由于笔记本电脑关机,该工作在几个小时前就被中断了。您不希望这种情况再次发生,因此花了一些时间在 Google 上搜索或询问您最喜欢的 LLM 如何使用 screen 或 tmux 在后台运行该命令。如果从一开始就支持异步查询,那么您将节省大量时间和精力!

异步处理是软件工程中一种有用的开发模式。它具有提高资源利用率、解除主执行线程阻塞等优点。

异步查询有用的一些示例是:

  • DBA 运行临时维护。
  • 在 Jupyter笔记本等交互式环境中进行开发。您可以使用异步任务来避免阻塞笔记本,或者只是稍后再回来检查任务,而不是提交长时间运行的查询,而只是让您的笔记本挂起然后崩溃。
  • 长时间运行的分析查询。例如,满足临时请求,如查看过去一个月每天有多少新用户注册。您可以提交该查询并让它在后台运行,同时继续其他工作。

使用异步功能扩展 Postgres

pg_later 类似,您可以将查询发送到您的 Postgres 数据库,而不必等待结果,您的程序可以根据您的方便返回和检索结果。

一个常见示例是手动执行VACUUM表操作。通常,人们可能在一个会话中执行 VACUUM,然后使用另一个会话通过 检查 VACUUM 作业的状态pg_stat_progress_vacuum。pg_later 让您能够在单个会话中执行此操作。您可以使用它来排队 Postgres 数据库上的任何长时间运行的分析或管理任务。

堆叠 Postgres 扩展

pg_later 建立在PGMQ之上,这是 Tembo 的另一个开源扩展。一旦用户提交查询,pg_later 就会无缝地将请求排入 Postgres 管理的消息队列。然后,此机制会异步处理查询,确保不会出现不必要的等待时间或延迟。

Postgres 后台工作程序 从队列中获取查询并执行它。结果以JSONB 格式写入表并持久化,可以使用 pg_later API 轻松检索。您可以简单地引用查询提交时提供的唯一作业 ID 并检索结果集,或者直接查询表。默认情况下,结果将永久保留。但是,我们正在将保留策略作为一项功能构建到 pg_later 中。

使用 pg_later

首先,请查看我们项目的README以获取安装扩展的指南。

初始化扩展

首先,您需要初始化扩展。这将处理 PGMQ 对象(如作业队列和一些元数据表)的管理。

sql 复制代码
select pglater.init();

调度查询

现在,您已准备好分派查询。使用 pglater.exec 提交查询,并确保记下job_id返回的。在本例中,这是第一个作业,因此job_id为 1。

sql 复制代码
select pglater.exec(
  'select * from pg_available_extensions limit 2'
) as job_id;
sql 复制代码
 job_id
--------
     1
(1 row)

检索结果

只要您准备好,只需查询一下即可获得结果:

sql 复制代码
select pglater.fetch_results(1);
sql 复制代码
{
  "query": "select * from pg_available_extensions limit 2",
  "job_id": 1,
  "result": [
    {
      "name": "pg_later",
      "comment": "pg_later:  Run queries now and get results later",
      "default_version": "0.0.6",
      "installed_version": "0.0.6"
    },
    {
      "name": "pgmq",
      "comment": "Distributed message queues",
      "default_version": "0.10.1",
      "installed_version": "0.10.1"
    }
  ],
  "status": "success"
}
相关推荐
ybb_ymm27 分钟前
mysql8在linux下的默认规则修改
linux·运维·数据库·mysql
倔强的石头_1 小时前
Navicat Premium 与金仓数据库融合实践:高效管理国产数据库新方案
数据库
程序新视界2 小时前
为什么要尽量将MySQL表字段要设置为NOT NULL?
数据库·mysql·dba
怪兽20142 小时前
SQL优化手段有哪些
java·数据库·面试
lypzcgf3 小时前
FastbuildAI后端数据库模块注册分析
数据库·ai应用·ai创业·智能体平台·ai应用平台·agent平台·fastbuildai
xyy20254 小时前
Spring事务的传播方式
java·数据库·spring
非凡的世界4 小时前
Thinkphp8 Redis队列与消息队列topthink/think-queue 原创
数据库·redis·bootstrap·thinkphp
yookay zhang4 小时前
DM线程的管理知识学习
数据库
l1t5 小时前
测试DuckDB电子表格读取插件rusty_sheet 0.2版
数据库·rust·插件·xlsx·duckdb
TiAmo zhang5 小时前
SQL Server 2019实验 │ 表数据插入、修改和删除
数据库·oracle