GaussDB(DWS)视图解耦之自动重建与REPLACE

举报
陈增晨 发表于 2021/07/14 20:01:56 2021/07/14
【摘要】 本文主要是自动重建功能与REPLACE的使用场景与使用方法的介绍。

1、背景简介

​  为了解决视图和表依赖而无法单独修改基表对象的问题,GaussDB(DWS) 实现了视图的解耦与重建功能。本文重点介绍了自动重建与CREATE OR REPLACE的使用场景与使用方法。

2、场景介绍

2.1视图简介

​  GaussDB(DWS)数仓产品的视图是通过规则系统来实现的。

实际上视图创建的语句如下:

CREATE VIEW myview AS SELECT * FROM mytab;

内部实际执行内容为:

CREATE TABLE myview (same column list as mytab);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
    SELECT * FROM mytab;

2.2 视图解耦

​  GaussDB(DWS)数仓产品内部使用对象标识符(oid)来保存对象之间的引用关系,这使得视图在定义的时候就绑定了其依赖的数据库对象的oid,而不管其名称怎么改变,都不会改变这层依赖关系。如果要对基表进行一些字段修改,会因为与视图字段存在强绑定而报错。视图解耦即为存在视图依赖的基表或其他数据库对象(视图、同义词、函数、表字段)可以单独删除,而其上关联的依赖视图依然存在,且在基表重建后,其依赖的视图在满足规则的基础上依然可用。

2.3 使用场景

场景描述

​  自动重建是利用视图定义时的规则作为基准规则,然后利用视图定义获取的新的规则去判断是否可以匹配基准规则,如果匹配成功,将会自动重建;反之,说明无法重建,需要自己排查或者利用CREATE OR REPLACE 的方式,重新定义视图规则。如上图所示,初始创建时,视图v1和v11创建时,都会在系统表中创建视图的基准规则。以drop table t1 为例,当视图依赖的表或表字段被删除后,与其关联的视图将会被置为无效视图。此时重建建立表t1后。利用select * from v11查询视图,目前v11 视图处于无效状态,视图v11其将会按照定义create view v1 as select a, b from v1,以递归的方式按照v1—>v11的方式重建,如果重建成功,将会刷新视图的状态,然后返回用户要查询的结果。

3、使用方法

3.1 设置guc参数

​  视图解耦功能利用GUC参数view_independent进行控制,默认关闭,为sighup类型,reload生效。使用时需要用户手动打开。

gs_guc reload -Z coordinator -Z datanode -D data/coordinator1/  -c "view_independent=on"

3.2 创建表和视图

CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a);
CREATE VIEW v1 AS SELECT a, b FROM t1;
CREATE VIEW v11 AS SELECT a FROM v1;

3.3 删除表t1

DROP TABLE t1;

SELECT * from v11;
ERROR:  relation "public.t1" does not exist

select * from gs_view_invalid;
  oid  | schemaname | viewname | viewowner |         definition          | validtype
-------+------------+----------+-----------+-----------------------------+-----------
 16391 | public     | v1       | xxx       | SELECT a, b FROM public.t1; | invalid
 16395 | public     | v11      | xxx       | SELECT a FROM public.v1;    | invalid
(2 rows)

3.4 自动重建

CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a);

SELECT * from v1;
 a
---
(0 rows)

-- 视图只有使用才能自动刷新
select * from gs_view_invalid;
  oid  | schemaname | viewname | viewowner |         definition          | validtype
-------+------------+----------+-----------+-----------------------------+-----------
 16395 | public     | v11      | xxx       | SELECT a FROM public.v1;    | invalid
(1 rows)

DROP TABLE t1;
CREATE TABLE t1 (a int, b int, c char(10)) DISTRIBUTE BY HASH (a);
SELECT * from v11;
select * from gs_view_invalid;
  oid  | schemaname | viewname | viewowner |         definition          | validtype
-------+------------+----------+-----------+-----------------------------+-----------
(0 rows)

3.5 CREATE OR REPLACE 视图

DROP TABLE t1;

CREATE TABLE t1 (a int) DISTRIBUTE BY HASH (a);

SELECT * from v11;
ERROR:  column "b" does not exist
CONTEXT:  referenced column: b

postgres=# \d+ v11
              Invalid View "public.v11"
 Column |  Type   | Modifiers | Storage | Description
--------+---------+-----------+---------+-------------
 a      | integer |           | plain   |
View definition:
SELECT a FROM public.v1;
CREATE OR REPLACE VIEW v1 AS SELECT a FROM t1;

-- 视图只有使用才能自动刷新
select * from gs_view_invalid;
  oid  | schemaname | viewname | viewowner |         definition          | validtype
-------+------------+----------+-----------+-----------------------------+-----------
 16395 | public     | v11      | xxx       | SELECT a FROM public.v1;    | invalid
(1 rows)

SELECT * from v11;
select * from gs_view_invalid;
  oid  | schemaname | viewname | viewowner |         definition          | validtype
-------+------------+----------+-----------+-----------------------------+-----------
(0 rows)

4、总结

​  利用sighup类型guc参数view_independent,进行reload之后,此时进入视图解耦模式,在该模式下,实现视图解耦的操作。该视图解耦的项目中,按照视图解耦、手动重建、自动重建以及create or replace的方式,不断迭代和完善GaussDB(DWS)的功能。希望大家使用该功能并提出各种评测和建议。

参考材料:

视图解耦: https://bbs.huaweicloud.cn/blogs/183594

手动重建:https://bbs.huaweicloud.cn/blogs/238425

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~
关于GaussDB(DWS)更多信息,欢迎大家上论坛探讨交流,干货慢慢哦~
image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。