替换索引中使用的函数

Dyl*_*ger 7 postgresql indexing function plpgsql

当我更改底层函数时,在函数上构建的索引会发生什么?

说,我有一个函数clean_name()定义为:

CREATE OR REPLACE FUNCTION clean_name(n text)
RETURNS TEXT AS
$BODY$
DECLARE
 rec TEXT;
BEGIN
 EXECUTE
  'SELECT Regexp_replace(' || quote_literal(n) || ', ''[a-z]'', '''', ''g'');'
 INTO rec;
RETURN rec;
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE
;
Run Code Online (Sandbox Code Playgroud)

然后创建一个索引:

CREATE INDEX my_table_upper_name_btree
ON schema.my_table USING GIST (my_text_field);
Run Code Online (Sandbox Code Playgroud)

但后来我决定重新定义函数来删除大写字母.我创建的索引会发生什么?它会自行改变吗?难道我DROPCREATE一次?VACUUM [ANALYZE] [FULL]

(有问题的功能是相似的,而是使用相当冗长的一系列替换,这些替换仍在调整但预计会保持稳定.)

Cra*_*ger 6

IMMUTABLE意思是"不改变"或"不可改变".您必须做的是严格避免违反该规则,删除该功能以及依赖于该功能的所有内容然后重新创建它以及使用它的索引.

如果您就地更换功能,则需要对后果负责.就个人而言,我认为PostgreSQL应该因为这个原因而不允许OR REPLACE使用IMMUTABLE函数,这会迫使你跳过像设置ignore_immutable_checks_even_though_it_might_cause_incorrect_queries配置选项那样的额外环节.

如果更改不可变函数的行为,则基于该函数的索引无效.服务器无法判断函数的行为是否已更改; 您可能只是将其替换为在各方面具有相同行为的优化版本.因此,它不会使索引无效,但也许它应该是,因为如果您的函数的行为确实不同,您可以获得基于该函数的查询的不正确的查询结果.