gpt4 book ai didi

function - 替换索引中使用的函数

转载 作者:行者123 更新时间:2023-11-29 11:21:26 26 4
gpt4 key购买 nike

当我更改底层函数时,基于函数构建的索引会发生什么情况?

比如说,我有一个函数 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
;

然后创建索引:

CREATE INDEX my_table_upper_name_btree
ON schema.my_table USING GIST (my_text_field);

但后来我决定重新定义函数来移除大写字母。我创建的索引会怎样?它会自行改变吗?我要再次DROPCREATE 吗? VACUUM [ANALYZE] [FULL]

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

最佳答案

IMMUTABLE 表示“不改变”或“不可改变”。要严格避免违反该规则,您必须做的是删除函数和依赖于它的所有内容,然后重新创建它和使用它的索引。

如果您就地替换函数,您将对后果负责。出于这个原因,我个人认为 PostgreSQL 应该禁止 OR REPLACE 用于 IMMUTABLE 函数,迫使你跳过一个额外的环节,比如设置 ignore_immutable_checks_even_though_it_might_cause_incorrect_queries 配置选项。

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

关于function - 替换索引中使用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com