更新时间: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;

相关文档