当VIEW table 计算或更改值时?

When the VIEW table calculate or change the value?

我创建了一个视图 table,喜欢

CREATE VIEW a AS SELECT b.kcu_id, sum(b.price), FROM b GROUP BY b.kcu_id

我创建了一个视图,因为我的 table 包含太多行,例如 10000 或更多。如果每次调用 get 操作都必须对那么多行求和,则成本太高。 我使用 spring data jpa 从视图中获取数据。我想问的是,当我使用getPrice方法获取价格总和时,当我使用get方法时计算总和或者当b [=19中的列性能发生变化时数据库计算总和=] 在数据库中?

请注意,在我的案例中,价格栏很少更改。

如果它只是一个像示例中那样的 "regular" 视图,则每次查询时都会重新计算数据。毕竟,视图只是 table 中任何给定点的数据的略微修改视图。

你可以拥有他们所谓的 "materialised views",这更像是一个物理 table,它会定期从底层 table 更新,但你通常必须以不同的方式来做正常 "create view" 命令。

对于 PostgreSQL,您正在寻找的命令是:

create materialized view
refresh materialized view

前者创建实体化视图的方式与您的 create view 几乎相同,并且还使用数据填充视图(除非您使用了 with no data 子句)。它还会记住用于创建视图的基础查询(如 any 视图),以便您可以在稍后更新数据(这就是上面的 refresh 命令确实)。

例如,以下 PostgreSQL 代码:

create table below (val integer);

insert into below values (42);
create materialized view above as select * from below;
insert into below values (99);

select * from below;
select * from above;

refresh materialized view above;
select * from above;

将在 table 仅包含 42 时实现视图,稍后刷新它以包含 99

Underlying table 'below' with both data items:
| val |
|-----|
|  42 |
|  99 |

Materialised view 'above', created before the insert of 99:
| val |
|-----|
|  42 |

Materialised view 'above' after refreshing the view:
| val |
|-----|
|  42 |
|  99 |

如果您愿意忍受数据可能有点过时的可能性,这可能是最好的方法。考虑到您对 "price column is rarely change[d]" 的评论,这可能不是问题。

然而,我真的很惊讶 10,000 行给你带来了问题,这并不是 大 table。因此,您可能需要查看其他可能的修复方法,例如确保在 kcu_id 列上有一个索引。