【问题标题】:Trigger to rerun SQL query when table is updated更新表时触发重新运行 SQL 查询
【发布时间】:2021-02-23 21:22:46
【问题描述】:

假设我有 3 个表 A、B、C 和一个表 D,这样 D 是从以下查询创建的:

SELECT DISTINCT ON (col_a) col_a,col_b FROM A WHERE col_b IS NOT NULL
UNION
SELECT DISTINCT ON (col_a) col_a,col_b FROM B WHERE col_b IS NOT NULL
UNION
SELECT DISTINCT ON (col_a) col_a,col_b FROM C WHERE col_b IS NOT NULL

我希望在插入任何表 A、B 或 C 时更新 D。我想我会使用触发器来做到这一点,但我在网上找不到任何关于如何在插入触发器上重新运行查询的信息。

我想这样做的原因是因为它是一个更大查询中的一个子查询,而这个子查询确实会拖慢查询时间。我希望通过将其存储在一个定期自我更新的表中,可以将查询速度提高到可接受的程度。

【问题讨论】:

  • DISTINCT ON 没有 ORDER BY 是 . . .好麻烦。

标签: sql postgresql triggers


【解决方案1】:

创建 视图 将是直接的方法,例如

CREATE OR REPLACE VIEW D AS
SELECT DISTINCT ON (col_a) col_a, col_b FROM A WHERE col_b IS NOT NULL UNION 
SELECT DISTINCT ON (col_a) col_a, col_b FROM B WHERE col_b IS NOT NULL UNION 
SELECT DISTINCT ON (col_a) col_a, col_b FROM C WHERE col_b IS NOT NULL

Demo

【讨论】:

  • 这是一个好主意,但是,我希望将其存储在表 (D) 中的原因是因为我目前将此查询(我的问题中的那个)作为子查询和它确实使运行时陷入困境。我的目标是通过将这些数据先前存储在它自己的表中来加快查询速度,这就是为什么我不确定视图是否适用于这种情况。
  • 您可以在AFTER 触发器中使用物化视图和REFRESH。但是,如果您在每次更新时都运行该查询,那么治愈方法可能比疾病更糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2012-02-02
  • 2021-02-12
  • 2011-05-28
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多