我正在尝试更新PostgreSQL数据库中的一个表,该表有大约230万行。我们还有一个与此表关联的事件触发器,它应该在更新/插入/删除一行时运行一个微服务来执行进一步的计算。
正如预期的那样,我第一次更新表时,这导致创建了超过200万个未决事件,以每小时清除几千个事件的速度,我无法选择等待所有事件被处理。
我希望在没有事件触发器创建任何挂起事件的情况下更新表中的数据。
- 删除事件触发器,更新表,然后重新创建事件触发器。虽然一开始我们没有任何挂起的事件,但一旦重新创建事件触发器,所有这些事件都会重新出现。
- 操作存储事件日志的表,手动删除过去2天内创建的所有未决事件(遵循Hasura文件here)。
DELETE FROM hdb_catalog.event_invocation_logs
WHERE event_id IN (
SELECT id FROM hdb_catalog.event_log
WHERE trigger_name = 'my_trigger_name'
AND delivered = false
AND created_at > now() - interval '2 days');
以上每次只会删除几十个事件,然后由于某种原因结束运行。
- 在我尝试删除所有事件日志作为最后手段之前,我想知道这样做是否安全:
DELETE FROM hdb_catalog.event_invocation_logs;
DELETE FROM hdb_catalog.event_log;
任何帮助都很感激,谢谢。
1条答案
按热度按时间j9per5c41#
实际上,您是如何执行涉及230万行的update语句的呢?您只是直接使用SQL运行它吗?
如果是这样,您可以这样 Package 语句:
处于复制模式时不执行触发器