GaussDB(DWS)视图解耦之自动重建与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.com/blogs/183594
手动重建:https://bbs.huaweicloud.com/blogs/238425
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~
关于GaussDB(DWS)更多信息,欢迎大家上论坛探讨交流,干货慢慢哦~
- 点赞
- 收藏
- 关注作者
评论(0)