当VIEW表计算或更改值时?

时间:2015-10-26 02:57:49

标签: spring postgresql view spring-data-jpa spring-data-rest

我创建了一个View表,比如

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

我创建了一个视图,因为我的表包含太多行,例如10000或更多。如果我们必须在每次调用操作时总计那么多行,那就太昂贵了。 我使用spring数据jpa从视图中获取数据。我想问的是,当我使用getPrice方法获取价格总和时,它是在我使用get方法时计算总和,或者当数据库中b表中的列性能发生变化时计算总和?

对于您的信息,价格列在我的情况下很少改变。

1 个答案:

答案 0 :(得分:0)

如果它只是您示例中的“常规”视图,则每次查询时都会重新计算数据。毕竟,视图只是在任何给定点上对表中数据进行略微修改的视图。

你可以拥有他们所谓的“物化视图”,它更像是一个定期从基础表更新的物理表,但你通常必须采用与普通“创建视图”命令不同的方式。

使用PostgreSQL,您正在寻找的命令是:

create materialized view
refresh materialized view

前者以与create view几乎相同的方式创建物化视图,并使用数据填充视图(除非您使用了with no data子句)。它还会记住用于创建视图的基础查询(例如任何视图),以便您可以在稍后更新数据(这是上面的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;
当表格仅包含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 |

如果您愿意接受数据可能有点过时的可能性,那么这可能是最好的方法。鉴于您的评论“价格列很少改变[d]”,这可能不是问题。

然而,实际上我很惊讶10,000行会导致你出现问题,而且 大不了一个表。因此,您可能希望查看其他可能的修复,例如确保您在kcu_id列上有索引。