这看起来像是
PL/pgSQL plan caching
. 你是对的,这应该是一种优化技术,但正如你所看到的,它偶尔会做出一些相当可疑的决定。
通常,可以通过以下方式运行查询来抑制此行为:
EXECUTE
,这将迫使PL/pgSQL每次都重新规划它:
CREATE OR REPLACE FUNCTION "SMSCEngine".f_get_redis_test(input_param integer)
RETURNS TABLE(_key text, _value text)
LANGUAGE plpgsql
AS $function$
begin
return query
execute 'select "key", value from redis_db0_ch where "key" = $1'
using 'Ch_' || input_param;
end;
$function$
然而,如果您的函数只是一个查询,那么可能根本不需要PL/pgSQL;你可以把它写进去
LANGUAGE sql
,据我所知,它没有这个问题:
CREATE OR REPLACE FUNCTION "SMSCEngine".f_get_redis_test(input_param integer)
RETURNS TABLE(_key text, _value text)
LANGUAGE sql
AS $function$
select "key", value from redis_db0_ch where "key" = 'Ch_' || input_param
$function$