我创建了一个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表中的列性能发生变化时计算总和?
对于您的信息,价格列在我的情况下很少改变。
答案 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
列上有索引。