介绍 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"
}
相关推荐
极创信息2 分钟前
信创产品认证怎么做?信创产品测试认证的主要流程
java·大数据·数据库·金融·软件工程
lzhdim1 小时前
SQL 入门 12:SQL 视图:创建、修改与可更新视图
java·大数据·服务器·数据库·sql
2301_795099741 小时前
让 CSS Grid 自适应容器尺寸的动态布局方案
jvm·数据库·python
FQNmxDG4S2 小时前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
热爱运维的小七2 小时前
告别内存溢出:ActiveMQ 性能诊断与全流程优化
数据库·it运维·activemq·devops
@小柯555m2 小时前
MySql(高级操作符--操作符混合运用)
数据库·sql·mysql
CDN3602 小时前
排查实录:网站偶发502/504错误?360CDN回源超时配置与日志分析技巧
前端·数据库
bzmK1DTbd2 小时前
JDBC编程规范:PreparedStatement与事务管理
数据库·python·eclipse
卧室小白3 小时前
Redis-哨兵模式
数据库·redis·缓存