让postgres忽略当前版本不支持的语句
Make postgres ignore statement that current version does not support
背景
一项服务运行针对多个相似 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?
使用动态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;
背景
一项服务运行针对多个相似 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?
使用动态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;