#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"
}