使postgres忽略当前版本不支持的声明

时间:2018-12-07 12:08:39

标签: postgresql plpgsql postgresql-9.6 postgresql-10

背景

针对多个相似 PostgreSQL实例运行相同任务的服务。大多数环境使用的是版本10,但有些则使用的是9。至少短期内,不建议对其进行升级。

问题

为了提高性能,我们使用了PostgreSQL 10功能CREATE STATISTICS。在v10的环境中,它可以正常工作,但在v9上不受支持。

处理该问题的一种方法是,复制使用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;

问题

是否有一种方法可以运行其中包含不受支持的语句(例如CREATE STATISTICS)的脚本,而不会给postgres 9提供小费?

1 个答案:

答案 0 :(得分:1)

使用动态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;