Em uma função de gatilho, quero fazer pg_notify()
chamadas condicionalmente, dependendo de uma opção de configuração do aplicativo. Para fazer isso, criei um wrapper notify_conditionally()
. Se o aplicativo for iniciado com as notificações desabilitadas, uma segunda função SQL criará esse wrapper que não faz nada e é definido como IMMUTABLE
:
CREATE OR REPLACE FUNCTION notify_conditionally(channel text, payload text) RETURNS int
LANGUAGE plpgsql IMMUTABLE AS
$inner$
BEGIN
PERFORM 1 WHERE 1 = 0;
RETURN 0;
END;
$inner$;
Se as notificações estiverem habilitadas, esta função é definida como uma chamada para pg_notify()
com os parâmetros da função:
CREATE OR REPLACE FUNCTION notify_conditionally(channel text, payload text) RETURNS int
LANGUAGE plpgsql STABLE AS
$inner$
BEGIN
PERFORM pg_notify(channel, payload);
RETURN 0;
END;
$inner$;
Como os parâmetros para conditionally_notify()
(e, portanto, pg_notify()
) mudam a cada chamada, suponho que a palavra- IMMUTABLE
chave não ajude muito em termos de cache de valor de resultado (na verdade, pode até ser contraproducente?). Portanto, estou querendo saber se existe uma maneira de definir essa função como "constante" e fazer com que o planejador seja inteligente o suficiente para não chamar essa função ou apenas chamá-la uma vez e reutilizar o primeiro resultado para todas as outras chamadas? Isso seria basicamente como um IMMUTABLE
que ignora todos os parâmetros. Isso seria útil para evitar chamar essa função se as notificações estiverem desabilitadas. Em consultas maiores, isso faz uma diferença de ~ 500ms no meu caso e, idealmente, eu poderia diminuir isso no caso de notificações desabilitadas.
Embora seja uma possibilidade também atualizar o código que usa a notify_conditionally()
função dinamicamente com base em se as notificações estão habilitadas e no caso de não serem apenas não use notify_conditionally()
, eu preferiria não fazer isso. A razão é que isso acontece em uma função de gatilho bastante grande que atualmente só deve ser alterada por meio de uma migração completa.
Declare a versão no-op como uma função SQL, então ela será alinhada como um valor constante pelo otimizador.