更新时间:2026-10-21 GMT+08:00
操作指导
前提条件
- 控制视图的级联失效:设置GUC参数enable_view_invalidation为on。
- 控制视图一次性入库:设置GUC参数enable_force_create_obj为on。
语法
支持通过如下语法对视图重新编译:
ALTER VIEW view_name COMPILE;
注意事项
- 功能使用前,请先检查是否存在失效对象,失效对象被调用,可能会出现一些异常情况。
- 建议避免构造对象依赖成环的场景,访问和编译会出现异常情况。
- 执行失效重编译过程中,不建议执行其它DML操作。
- 视图重编译失败时,可通过CREATE OR REPLACE VIEW语法重建视图。
操作步骤
- 使用系统管理员user1连接数据库,password为密码,port为数据库端口号,用户可根据实际情况替换。
gsql -d postgres -U user1 -W password -p port -r
- 检查如下参数值是否正确,如果不正确,请联系管理员修改参数值。
- 执行如下命令检查enable_force_create_obj是否为on。
gaussdb=# SHOW enable_force_create_obj;
- 执行如下命令检查enable_view_invalidation是否为on。
gaussdb=# SHOW enable_view_invalidation;
- 执行如下命令检查enable_force_create_obj是否为on。
- 执行如下命令在数据库中创建视图对象。
gaussdb=# CREATE TABLE tetab_v1(a int,b varchar(20)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# CREATE VIEW teview1 AS SELECT a, b FROM tetab_v1; CREATE VIEW
- 执行如下命令对视图依赖对象进行DDL变更。
gaussdb=# ALTER TABLE tetab_v1 MODIFY b varchar(30); ALTER TABLE
- 执行如下命令通过PG_OBJECT系统表检查是否存在失效对象,失效对象的valid字段置为false。
gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview1'; relname | valid ---------+------- teview1 | f (1 row)
- 执行ALTER COMPILE语法进行重编译。或者通过pg_catalog.gs_compile_schema批量重编译接口进行重编译。
gaussdb=# ALTER VIEW teview1 COMPILE; ALTER VIEW
- 执行如下命令检查PG_OBJECT系统表中是否存在valid字段是false的对象,确认全部对象变为有效。
gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview1'; relname | valid ---------+------- teview1 | t (1 row)
- 正常开启业务。
gaussdb=# SELECT * FROM teview1; a | b ---+--- (0 rows)
示例
- 示例一:视图手动重编译
-- 开启失效重编译参数。 gaussdb=# SET enable_view_invalidation=on; -- 创建表,视图依赖表。 gaussdb=# CREATE TABLE tetab_v1(a int,b int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# CREATE VIEW teview1 AS SELECT a, b FROM tetab_v1; -- 删除表。 gaussdb=# DROP TABLE tetab_v1; -- 查询视图有效性。 gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview1'; relname | valid ---------+------- teview1 | f (1 row) -- 重建视图依赖表。 gaussdb=# CREATE TABLE tetab_v1(a int,b int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE -- 手动编译视图,再次查看对象有效性。 gaussdb=# ALTER VIEW teview1 COMPILE; gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview1'; relname | valid ---------+------- teview1 | t (1 row) -- 删除视图。 gaussdb=# DROP VIEW teview1; -- 删除表。 gaussdb=# DROP TABLE tetab_v1;
- 示例二:视图自动重编译
-- 开启失效重编译参数。 gaussdb=# SET enable_view_invalidation=on; -- 创建表,视图依赖表。 gaussdb=# CREATE TABLE tetab_v2(a int,b int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# CREATE VIEW teview2 AS SELECT a, b FROM tetab_v2; -- 删除表。 gaussdb=# DROP TABLE tetab_v2; -- 查询视图有效性。 gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview2'; relname | valid ---------+------- teview2 | f (1 row) -- 重建视图依赖表。 gaussdb=# CREATE TABLE tetab_v2(a int,b int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE -- 使用视图自动重编译,再次查看对象有效性。 gaussdb=# SELECT * FROM teview2; a | b ---+--- (0 rows) gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'teview2'; relname | valid ---------+------- teview2 | t (1 row) -- 删除视图。 gaussdb=# DROP VIEW teview2; -- 删除表。 gaussdb=# DROP TABLE tetab_v2;
- 示例三:视图批量重编译
-- 开启失效重编译参数。 gaussdb=# SET enable_view_invalidation=on; -- 创建schema、表,视图依赖表,视图依赖视图 gaussdb=# DROP SCHEMA IF EXISTS tesch2 CASCADE; gaussdb=# CREATE SCHEMA tesch2; gaussdb=# SET current_schema = tesch2; gaussdb=# CREATE TABLE tab1 (c1 INT, c2 INT); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'c1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE gaussdb=# CREATE VIEW v_tab1 AS SELECT * FROM tab1; gaussdb=# CREATE VIEW v_tab2 AS SELECT * FROM v_tab1; gaussdb=# CREATE VIEW v_tab3 AS SELECT * FROM tab1; -- 删除表。 gaussdb=# DROP TABLE tab1; -- 查询对象有效性。 gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'v_tab1' or c.relname = 'v_tab2' or c.relname = 'v_tab3'; relname | valid ---------+------- v_tab1 | f v_tab2 | f v_tab3 | f (3 rows) -- 恢复删除的表。 gaussdb=# CREATE TABLE tab1 (c1 INT, c2 INT); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'c1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE -- 批量重编译tesch2命名空间下视图对象。 gaussdb=# CALL pg_catalog.gs_compile_schema('tesch2', true, 1); INFO: successful CONTEXT: referenced column: gs_compile_schema SQL statement "select pkg_util.gs_compile_schema(:schema_name, :compile_all, :retry_times);" PL/pgSQL function gs_compile_schema(character varying,boolean,integer) line 24 at EXECUTE statement INFO: The number of executions is 1 INFO: successful gs_compile_schema ------------------- t (1 row) -- 再次查询视图有效性。 gaussdb=# SELECT c.relname, o.valid FROM pg_catalog.pg_object o JOIN pg_catalog.pg_class c ON c.oid = o.object_oid WHERE c.relname = 'v_tab1' or c.relname = 'v_tab2' or c.relname = 'v_tab3'; relname | valid ---------+------- v_tab1 | t v_tab2 | t v_tab3 | t (3 rows) -- 删除视图。 gaussdb=# DROP VIEW v_tab3; gaussdb=# DROP VIEW v_tab2; gaussdb=# DROP VIEW v_tab1; -- 删除表。 gaussdb=# DROP TABLE tab1; gaussdb=# RESET current_schema; -- 删除schema。 gaussdb=# DROP SCHEMA tesch2 CASCADE;
父主题: 失效重编译