代码之家  ›  专栏  ›  技术社区  ›  Justinas Marozas

使postgres忽略当前版本不支持的语句

  •  0
  • Justinas Marozas  · 技术社区  · 6 年前

    针对多个服务器运行相同任务的服务 PostgreSQL实例。大多数环境都在版本10上,但有些环境在版本9上。至少在短期内,升级它们不是一个选项。

    为了提高性能,我们使用了PostgreSQL 10特性 CREATE STATISTICS

    处理这个问题的一种方法是复制使用它的每个脚本 创建统计数据 ,在不使用这些语句的情况下维护其副本,并选择要在应用程序级别运行的脚本。我想避免它,因为它需要维护大量重复的代码。

    我试图通过仅在脚本找到合适版本(下面的代码)时创建统计信息来欺骗它,但在v9上它仍然被认为是语法错误。

    DO $$
    
    -- server_version_num is a version number melted to an integer:
    --  9.6.6 -> 09.06.06 ->  90606
    -- 10.0.1 -> 10.00.01 -> 100001
    DECLARE pg_version int := current_setting('server_version_num');
    
    BEGIN
    
    IF pg_version >= 100000 THEN
      CREATE STATISTICS table_1_related_col_group_a (NDISTINCT)
      ON col_a1, col_a2
      FROM schema_1.table_1;
    
      CREATE STATISTICS table_2_related_col_group_b (NDISTINCT)
      ON col_b1, col_b2, col_b3
      FROM schema_1.table_2;
    END IF;
    
    END $$ LANGUAGE plpgsql;
    

    有没有办法运行包含不受支持语句的脚本,如 创建统计数据 不给第九届博士后小费?

    1 回复  |  直到 6 年前
        1
  •  1
  •   404 Aniket Jha    6 年前

    使用动态SQL。除非执行,否则不会对其进行评估。

    DO $$
    
    -- server_version_num is a version number melted to an integer:
    --  9.6.6 -> 09.06.06 ->  90606
    -- 10.0.1 -> 10.00.01 -> 100001
    DECLARE pg_version int := current_setting('server_version_num');
    
    BEGIN
    
    IF pg_version >= 100000 THEN
      EXECUTE 'CREATE STATISTICS table_1_related_col_group_a (NDISTINCT)
               ON col_a1, col_a2
               FROM schema_1.table_1;
    
               CREATE STATISTICS table_2_related_col_group_b (NDISTINCT)
               ON col_b1, col_b2, col_b3
               FROM schema_1.table_2;';
    END IF;
    
    END $$ LANGUAGE plpgsql;