postgres=# select pgivm.create_immv('mvt1','select * from t1');
NOTICE: could not create an index on immv "mvt1" automatically
DETAIL: This target list does not have all the primary key columns, or this view does not contain GROUP BY or DISTINCT clause.
HINT: Create an index on the immv for efficient incremental maintenance.
create_immv
-------------
6
(1 row)
当增量物化视图被创建成功后,物化视图的更新将自动进行。
-- 查看基表数据
postgres=# select * from t1;
id | name | course | score
----+---------+---------+-------
1 | qupeng | math | 90
2 | qupeng | english | 60
3 | yangwei | math | 69
4 | yangwei | english | 80
5 | lijing | math | 88
6 | lijing | english | 80
(6 rows)
-- 查看物化视图数据
postgres=# select * from mvt1;
id | name | course | score
----+---------+---------+-------
1 | qupeng | math | 90
2 | qupeng | english | 60
3 | yangwei | math | 69
4 | yangwei | english | 80
5 | lijing | math | 88
6 | lijing | english | 80
(6 rows)
-- 插入数据
postgres=# insert into t1 values(7,'xiexuedi','computer',100);
INSERT 0 1
-- 查看物化视图,有更新
postgres=# select * from mvt1;
id | name | course | score
----+----------+----------+-------
1 | qupeng | math | 90
2 | qupeng | english | 60
3 | yangwei | math | 69
4 | yangwei | english | 80
5 | lijing | math | 88
6 | lijing | english | 80
7 | xiexuedi | computer | 100
(7 rows)
创建增量物化视图
使用create_immv函数创建增量物化视图。
postgres=# select pgivm.create_immv('mvt2','select b,sum(a) from t4 group by b');
NOTICE: created index "mvt2_index" on immv "mvt2"
WARNING: inconsistent view can be created in isolation level SERIALIZABLE or REPEATABLE READ
DETAIL: The view may not include effects of a concurrent transaction.
HINT: create_immv should be used in isolation level READ COMMITTED, or execute refresh_immv to make sure the view is consistent.
create_immv
-------------
2
(1 row)
postgres=# CREATE MATERIALIZED VIEW mv_normal AS
SELECT a.aid, b.bid, a.abalance, b.bbalance
FROM pgbench_accounts a JOIN pgbench_branches b USING(bid);
SELECT 1000000
Time: 3372.753 ms (00:03.373)
postgres=# UPDATE pgbench_accounts SET abalance = 1000 WHERE aid = 1;
UPDATE 1
Time: 1.652 ms
postgres=# REFRESH MATERIALIZED VIEW mv_normal ;
REFRESH MATERIALIZED VIEW
Time: 2710.322 ms (00:02.710)
可以看到对普通物化视图进行刷新与新创建物化视图的代价相近,代价非常大。而增量物化视图是实时更新,非常快。正常情况下,增量物化视图相比普通物化视图,其优势在于其更新物化视图快,可以立即更新。而带来的代价就是对基表的更新慢一些。这是因为在增量物化视图中,对基表进行更新时,还需要额外做物化视图的增量更新,所以对基表的更新操作会慢一些。
postgres=# SELECT pgivm.create_immv('immv',
'SELECT a.aid, b.bid, a.abalance, b.bbalance
FROM pgbench_accounts a JOIN pgbench_branches b USING(bid)');
NOTICE: created index "immv_index" on immv "immv"
create_immv
-------------
1000000
(1 row)
Time: 3581.543 ms (00:03.582)
postgres=# UPDATE pgbench_accounts SET abalance = 1234 WHERE aid = 1;
UPDATE 1
Time: 5.112 ms
postgres=# SELECT * FROM immv WHERE aid = 1;
aid | bid | abalance | bbalance
-----+-----+----------+----------
1 | 1 | 1234 | 0
(1 row)