当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
列上有一个索引。
我创建了一个视图 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
列上有一个索引。