跳到主要内容

PostgreSQL 视图

Halo 的 PostgreSQL 模式支持普通视图(VIEW)与物化视图(MATERIALIZED VIEW)。

普通视图​

普通视图是一段保存的查询语句,不实际存储数据,每次查询时实时计算。

postgres=# CREATE TABLE employees(id INT, name TEXT, salary NUMERIC);
CREATE TABLE
postgres=# INSERT INTO employees VALUES (1,'Alice',10000),(2,'Bob',15000),(3,'Carol',12000);
INSERT 0 3
postgres=# CREATE VIEW v_high_salary AS
postgres-# SELECT id, name, salary FROM employees WHERE salary >= 12000;
CREATE VIEW
postgres=# SELECT * FROM v_high_salary ORDER BY id;
id | name | salary
----+-------+--------
2 | Bob | 15000
3 | Carol | 12000
(2 行记录)

物化视图​

物化视图将查询结果实际持久化存储,适合复杂查询的结果缓存,可大幅提升查询性能。可通过 REFRESH MATERIALIZED VIEW 刷新数据。

postgres=# CREATE MATERIALIZED VIEW mv_avg_salary AS
postgres-# SELECT avg(salary) AS avg_sal FROM employees;
SELECT 1
postgres=# SELECT * FROM mv_avg_salary;
avg_sal
------------------------
12333.3333333333333333
(1 行记录)

普通视图 vs 物化视图:

  • 普通视图:不存数据,每次查询实时计算,始终反映底表的最新数据,适合简单过滤场景。
  • 物化视图:实际存储查询结果,读取快但数据可能过期,需定期 REFRESH MATERIALIZED VIEW 视图名 同步。适合聚合、复杂联表等耗时查询的结果缓存。