更新时间:2026-07-28 GMT+08:00
常见问题
Q:怎么检查失效重编译特性是否可用?
A:参考执行如下命令,enable_view_invalidation值为on表示支持视图的级联失效,enable_force_create_obj值为on表示支持视图一次性入库。
gaussdb=# SELECT name,setting FROM pg_settings WHERE name in ('ddl_invalid_mode', 'enable_view_invalidation','enable_force_create_obj');
name | setting
--------------------------+---------
enable_force_create_obj | on
enable_view_invalidation | on
(2 rows) Q:怎么查询对象有效性?
A:查看指定对象有效性可以参考如下示例,从相关系统表查找对象oid,根据oid查询pg_object的valid字段,valid值为true表示有效,值为false表示无效。如下示例为查看视图信息。
gaussdb=# SELECT oid FROM pg_class WHERE relname = 'b_teview1'; oid -------- 221209 (1 row) -- 视图b_teview1有效。 gaussdb=# SELECT object_type, valid FROM pg_object WHERE object_oid = 221209; object_type | valid -------------+------- v | t (1 row)
Q:怎么进行重编译?
A:可以通过自动重编译、手动重编译、批量重编译的方式进行重编译操作:
- 自动重编译:例如视图view1依赖表tab1,表tab1变更会导致视图view1失效,恢复表tab1变更后,通过调用视图view1,视图会自动编译为有效。
- 手动重编译:例如视图view1依赖表tab1,表tab1变更会导致视图view1失效,恢复表tab1变更后,通过执行ALTER VIEW view1 COMPILE,视图会被编译为有效。
- 批量重编译:适用于对象较多,依赖关系复杂的场景,通过执行以下语句批量编译指定schema下的对象。
CALL pg_catalog.gs_compile_schema(schema_name, false, 10);
常见问题示例
- 问题一:在开启事务后恢复视图依赖对象,不支持通过调用视图触发其自动重编译。
-- 设置如下参数。 gaussdb=# SET enable_view_invalidation=on; -- 创建表。 gaussdb=# CREATE TABLE base_tab1(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 base_view1 AS SELECT a, b FROM base_tab1; -- 删除表,视图失效。 gaussdb=# DROP TABLE base_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 = 'base_view1'; relname | valid ------------+------- base_view1 | f (1 row) -- 开启视图,在事务内恢复视图依赖的表。 gaussdb=# BEGIN; gaussdb=# CREATE TABLE base_tab1(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 base_view1; ERROR: View "base_view1" is invalid and please check view definition. LINE 1: select * from base_view1; ^ -- 回滚事务。 gaussdb=# ROLLBACK; -- 重新开启视图,在视图内恢复视图依赖的表并手动重编译视图。 gaussdb=# BEGIN; gaussdb=# CREATE TABLE base_tab1(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 base_view1 COMPILE; -- 提交视图。 gaussdb=# COMMIT; -- 再次查询视图有效性。 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 = 'base_view1'; relname | valid ------------+------- base_view1 | t (1 row) -- 删除视图。 gaussdb=# DROP VIEW base_view1; -- 删除表。 gaussdb=# DROP TABLE base_tab1;
- 问题二:不支持同义词发生DDL变更触发视图失效。
-- 设置如下参数。 gaussdb=# SET enable_view_invalidation=on; -- 创建表。 gaussdb=# CREATE TABLE base_tab2(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 SYNONYM syn_tab FOR base_tab2; -- 创建视图,视图依赖同义词。 gaussdb=# CREATE VIEW base_view2 AS SELECT a, b FROM syn_tab; -- 删除同义词,与视图存在依赖不允许删除。 gaussdb=# DROP SYNONYM syn_tab; ERROR: synonym syn_tab cannot be dropped because other objects depend on it. DETAIL: view base_view2 depends on synonym public.syn_tab HINT: Use DROP ... CASCADE to drop the dependent objects. -- 删除视图。 gaussdb=# DROP VIEW base_view2; -- 删除同义词。 gaussdb=# DROP SYNONYM syn_tab; -- 删除表。 gaussdb=# DROP TABLE base_tab2;
- 问题三:临时视图不支持自动重编译,需手动重编译。
-- 设置如下参数。 gaussdb=# SET enable_view_invalidation=on; -- 创建表。 gaussdb=# CREATE TABLE base_tab3(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 TEMP VIEW temp_view AS SELECT a, b FROM base_tab3; -- 删除表。 gaussdb=# DROP TABLE base_tab3; -- 查询视图有效性。 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 = 'temp_view'; relname | valid -----------+------- temp_view | f (1 row) -- 重建视图依赖的表。 gaussdb=# CREATE TABLE base_tab3(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 temp_view; ERROR: View "temp_view" is invalid and please check view definition. LINE 1: SELECT * FROM temp_view; ^ -- 手动重编译视图。 gaussdb=# ALTER VIEW temp_view 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 = 'temp_view'; relname | valid -----------+------- temp_view | t (1 row) -- 删除视图。 gaussdb=# DROP VIEW temp_view; -- 删除表。 gaussdb=# DROP TABLE base_tab3;
父主题: 失效重编译