PostgreSQL视图和表的区别以及视图是否存数据
PostgreSQL 中的视图存储的不是数据,而是查询定义。让我详细解释一下:
*注:简单视图(来自单表、包含主键)在某些条件下可更新
在 PostgreSQL 中,有几种方法可以查看视图是否是物化视图:
视图的本质
视图是一个虚拟表,它:- 不存储实际数据,只存储 SELECT 查询语句
- 每次查询时动态生成结果
- 本质上是一个保存的查询
示例说明
-- 创建一个视图 CREATE VIEW employee_view AS SELECT id, name, department, salary FROM employees WHERE active = true; -- 查询视图时,PostgreSQL实际上执行: SELECT id, name, department, salary FROM employees WHERE active = true;
视图的两种类型
1. 普通视图(查询时计算)
CREATE VIEW sales_summary AS SELECT product_id, SUM(quantity) as total_qty, SUM(amount) as total_amount FROM sales GROUP BY product_id; -- 每次查询都重新计算
2. 物化视图(Materialized View,存储实际数据)
CREATE MATERIALIZED VIEW mv_sales_summary AS SELECT product_id, SUM(quantity) as total_qty, SUM(amount) as total_amount FROM sales GROUP BY product_id; -- 需要手动刷新数据 REFRESH MATERIALIZED VIEW mv_sales_summary;
视图 vs 表对比
| 特性 | 普通视图 | 物化视图 | 表 |
|---|---|---|---|
| 存储数据 | ❌ 不存储 | ✅ 存储 | ✅ 存储 |
| 查询速度 | 取决于基础表 | 快(有数据) | 快 |
| 数据实时性 | 实时 | 需要刷新 | 实时 |
| 占用存储 | 很小(只存定义) | 大(存储数据) | 大 |
| 更新数据 | 不可直接更新* | 不可直接更新 | 可直接更新 |
在 PostgreSQL 中,有几种方法可以查看视图是否是物化视图:
方法1:查询系统表(推荐)
-- 查看所有物化视图 SELECT schemaname, matviewname, matviewowner FROM pg_matviews WHERE schemaname NOT LIKE 'pg_%' ORDER BY schemaname, matviewname; -- 查看所有普通视图 SELECT schemaname, viewname, viewowner FROM pg_views WHERE schemaname NOT LIKE 'pg_%' ORDER BY schemaname, viewname; -- 查看特定对象是视图还是物化视图 SELECT n.nspname as schema_name, c.relname as object_name, CASE WHEN c.relkind = 'm' THEN 'MATERIALIZED VIEW' WHEN c.relkind = 'v' THEN 'VIEW' ELSE c.relkind END as object_type FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relname = 'your_view_name' -- 替换为你的视图名 AND n.nspname = 'public'; -- 替换为你的模式名

浙公网安备 33010602011771号