Сделайте postgres игнорировать заявление, что текущая версия не поддерживает - PullRequest
0 голосов
/ 07 декабря 2018

Фон

Служба, выполняющая одинаковые задачи для нескольких похожих экземпляров PostgreSQL.Большинство сред работают на версии 10, но некоторые - на 9. По крайней мере, в краткосрочной перспективе их обновление невозможно.

Проблема

Для повышения производительности мы использовалиФункция PostgreSQL 10 CREATE STATISTICS.Он отлично работает в средах на v10, но не поддерживается на v9.

Один из способов справиться с этим мог бы заключаться в дублировании каждого сценария, который использует CREATE STATISTICS, сохранении его копии без этого оператора ивыберите сценарий для запуска на уровне приложения.Я бы хотел избежать этого, так как он содержит много дублирующегося кода.

Я пытался обмануть его, создавая статистику только в том случае, если скрипт находит подходящую версию (код ниже), но в версии 9все еще воспринимается как синтаксическая ошибка.

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 off?

1 Ответ

0 голосов
/ 07 декабря 2018

Использовать динамический 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;
...