PostgreSQL视图和表的区别以及视图是否存数据

PostgreSQL 中的视图存储的不是数据,而是查询定义。让我详细解释一下:

视图的本质

视图是一个虚拟表,它:
  1. 不存储实际数据,只存储 SELECT 查询语句
  2. 每次查询时动态生成结果
  3. 本质上是一个保存的查询

示例说明

-- 创建一个视图
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';         -- 替换为你的模式名

 

posted @ 2025-12-19 15:20  你说夕阳很美  阅读(0)  评论(0)    收藏  举报