文档下载建议反馈入口

  • 创建物化视图
  • 修改物化视图
  • 刷新物化视图
  • 删除物化视图

物化视图

物化视图(Materialized View)是一种特殊的数据库对象。它是一种存储底层查询结果的视图。

创建物化视图

CREATE MATERIALIZED VIEW 语句用于创建物化视图。创建物化视图时,系统会将查询结果写入物化视图。用户无法向物化视图中插入数据,也无法修改或删除物化视图中的数据。当用户查询物化视图中的数据时,物化视图返回的存储数据可能已经过时。如需从物化视图中获取最新数据,用户需要手动刷新物化视图

KaiwuDB 不支持基于临时表、临时视图创建物化视图,也不支持显式事务创建物化视图。

所需权限

  • 非三权分立模式下,用户拥有所属数据库的 CREATE 权限和引用表的 SELECT 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有所属数据库的 CREATE 权限和引用表的 SELECT 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

参数说明

参数说明
IF NOT EXISTS可选关键字,当使用 IF NOT EXISTS 关键字时,如果目标物化视图不存在,系统创建物化视图。如果目标物化视图存在,系统创建物化视图失败,但不会报错。当未使用 IF NOT EXISTS 关键字时,如果目标物化视图不存在,系统创建物化视图。如果目标物化视图存在,系统报错,提示目标物化视图已存在。
view_name待创建物化视图的名称,该名称在数据库中必须唯一,并且遵循数据库标识符规则。如果没有将父数据库设置为默认值,必须将物化视图名称格式设置为 database.view_name
opt_column_list可选项,物化视图列名列表。支持指定一个或多个物化视图的列名,列名之间使用逗号(,)隔开。如果指定物化视图的列名,控制台输出指定的列名,而不是输出通过 select_stmt 语句指定的列的列名。
select_stmtSELECT 查询语句。

语法示例

本示例假设已经创建一个名为 orders 的表,包括顾客 ID,订单号和订单金额。以下示例为 orders 表创建一个名为 small_order 的物化视图,获取订单号和订单金额。

-- 1. 查看 orders 表的信息。

SELECT * FROM orders;
  customer_id |   id   | total
--------------+--------+--------
       100001 | 100001 |   234
       100001 | 100002 |   120
       100002 | 100003 |    59
       100002 | 100004 |   120
(4 rows)

-- 2. 创建 small_order 物化视图,获取订单号和订单金额。

CREATE MATERIALIZED VIEW small_order (id, amount) AS SELECT id, total FROM orders;


-- 3. 查看物化视图信息。

SELECT * FROM small_order;
    id   | amount
---------+---------
  100001 |    234
  100002 |    120
  100003 |     59
  100004 |    120
(4 rows)

修改物化视图

ALTER MATERIALIZED VIEW 语句用于修改物化视图的名称。

所需权限

  • 非三权分立模式下,用户拥有重命名前物化视图的 DROP 权限以及重命名后物化视图所属父数据库的 CREATE 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有重命名前物化视图 DROP 权限以及重命名后物化视图所属父数据库 CREATE 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标物化视图存在,系统修改目标物化视图。如果目标物化视图不存在,系统修改目标物化视图失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标物化视图存在,系统修改目标物化视图。如果目标物化视图不存在,系统报错,提示目标物化视图不存在。
view_name待重命名的物化视图的名称。支持使用 SELECT * FROM information_schema.tables WHERE table_type = 'MATERIALIZED VIEW' 语句查看物化视图名称。
name新的物化视图名称。该名称在数据库中必须唯一,并且遵循数据库标识符规则

语法示例

以下示例将 test_view 物化视图重命名为 names

-- 1. 查看所有物化视图。

SELECT * FROM information_schema.tables WHERE table_type = 'MATERIALIZED VIEW';
  table_catalog | table_schema | table_name  | table_type              | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+-------------------------+--------------------+---------+----------------
  db2           | public       | test_view   | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
  db2           | public       | small_order | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
(2 rows)

-- 2. 将 test_view 物化视图重命名为 names。

ALTER MATERIALIZED VIEW test_view rename to names;

-- 3. 查看所有物化视图。

SELECT * FROM information_schema.tables WHERE table_type = 'MATERIALIZED VIEW';
  table_catalog | table_schema | table_name  | table_type              | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+-------------------------+--------------------+---------+----------------
  db2           | public       | names       | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
  db2           | public       | small_order | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
(2 rows)

刷新物化视图

REFRESH MATERIALIZED VIEW 语句用于手动刷新物化视图。如未手动刷新物化视图,物化视图中的数据会一直保持不变。刷新物化视图,不会影响用户查询数据。用户可以使用 SHOW JOBS SQL 语句查看正在执行的刷新任务。如果执行刷新数据时已经有正在刷新的操作,系统会报错。

KaiwuDB 不支持显式事务刷新物化视图。

所需权限

  • 非三权分立模式下,用户拥有物化视图的 UPDATE 权限或者用户是 admin 角色的成员。默认情况下,root 用户属于 admin 角色。
  • 三权分立模式下,用户是拥有物化视图的 UPDATE 权限的普通用户。

语法格式

参数说明

参数说明
view_name物化视图的名称。

语法示例

以下示例刷新 small_orders 物化视图。

REFRESH MATERIALIZED VIEW small_orders;

删除物化视图

DROP MATERIALIZED VIEW 语句用于从数据库中删除物化视图。

所需权限

  • 非三权分立模式下,
    • 删除无依赖关系的物化视图:用户拥有目标物化视图的 DROP 权限。
    • 删除存在依赖关系的物化视图:用户拥有目标物化视图的 DROP 权限及其关联对象的 DROP 权限。
  • 三权分立模式下,
    • 删除无依赖关系的物化视图:用户是 sysadmin 角色的成员或者是拥有目标物化视图 DROP 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。
    • 删除存在依赖关系的物化视图:用户是 sysadmin 角色的成员或者是拥有目标物化视图及其关联对象 DROP 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标物化视图存在,系统删除目标物化视图。如果目标物化视图不存在,系统删除目标物化视图失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标物化视图存在,系统删除目标物化视图。如果目标物化视图不存在,系统报错,提示目标物化视图不存在。
view_name_list待删除的物化视图名称列表。支持指定一个或多个无依赖关系的物化视图,物化视图名称之间使用逗号(,)隔开。支持使用 SELECT * FROM information_schema.tables WHERE table_type = 'MATERIALIZED VIEW' 语句查看物化视图名称。
CASCADE可选关键字。删除目标物化视图及其关联对象。CASCADE 不会列出待删除的关联对象,应谨慎使用。
RESTRICT默认设置,可选关键字。如果其他对象依赖目标物化视图,则无法删除该物化视图。

语法示例

以下示例删除 names 物化视图。

-- 1. 查看所有物化视图。

SELECT * FROM information_schema.tables WHERE table_type = 'MATERIALIZED VIEW';
  table_catalog | table_schema | table_name  | table_type              | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+-------------------------+--------------------+---------+----------------
  db2           | public       | names       | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
  db2           | public       | small_order | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
(2 rows)

-- 2. 删除 names 物化视图。

DROP MATERIALIZED VIEW names;

-- 3. 查看所有物化视图。

SELECT * FROM information_schema.tables WHERE table_type = 'MATERIALIZED VIEW';
  table_catalog | table_schema | table_name  | table_type              | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+-------------------------+--------------------+---------+----------------
  db2           | public       | small_order | MATERIALIZED VIEW       | NO                 |       1 |    1497612465
(1 rows)