介绍 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"
}
相关推荐
Zfox_38 分钟前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
陈丹阳(滁州学院)3 小时前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle
远方16094 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
GUIQU.5 小时前
【Oracle】数据仓库
数据库·oracle
恰薯条的屑海鸥5 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖5 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
曼汐 .5 小时前
数据库管理与高可用-MySQL高可用
数据库·mysql
2301_793102495 小时前
Linux——MySql数据库
linux·数据库
喵叔哟5 小时前
第4章:Cypher查询语言基础
数据库
刘 大 望6 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql