gpt4 book ai didi

postgresql - Plpgsql 似乎正在删除和插入而不是更新 - 为什么?

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

我正在使用 postgreSQL 7.4。

我有一张大 table ,称它为 table_a:

key1 INT NOT NULL, 
key2 INT NOT NULL,
data INT NOT NULL,
itstamp INT NOT NULL DEFAULT (date_part('EPOCH'::text, (timeofday())::timestamp without time zone))::INTEGER

还有一个汇总了 key1 的最后更新时间的表,称之为 table_b:

key1        INT NOT NULL,
max_itstamp INT NOT NULL

我在 plpgsql 中创建了一个触发器函数来根据需要更新或插入 table_b 中的行:

CREATE OR REPLACE FUNCTION table_b_update() RETURNS TRIGGER AS '
DECLARE
l_key1 INT;
l_itstamp INT;
BEGIN
l_key1 := new.key1;
l_itstamp := new.itstamp;
PERFORM TRUE FROM table_b WHERE key1=l_key1;
IF NOT FOUND THEN
INSERT INTO table_b(key1, max_itstamp) values (l_key1, l_itstamp);
ELSE
UPDATE table_b SET max_itstamp=l_itstamp WHERE key1=l_key1;
END IF;
RETURN NULL;
END'
LANGUAGE plpgsql IMMUTABLE;

然后我将触发器附加到 table_a:

CREATE TRIGGER table_a_trigger1 AFTER INSERT OR UPDATE ON table_a FOR EACH ROW
EXECUTE PROCEDURE table_b_upate();

现在,将新数据插入 table_a 的时间逐渐增加。 table_b 的文件足迹稳步增长。

我在函数中使用 RAISE NOTICE 命令来确认 If 语句在第一次调用每个键后导致更新而不是插入。

由于每次 INSERT 的插入时间都会增加,所以我在 table_b 上尝试了 VACUUM FULL。插入时间变回早期插入的大致时间。 table_b 的文件大小已大大减少。在 VACUUM FULL 之后,插入时间又开始增长。我不想在每次 INSERT 之后都进行 VACUUM FULL。

是否有可能 UPDATE 实际上是在 table_b 中执行 DELETE 和 INSERT?

最佳答案

由于其并发哲学,Postgresql 很少就地执行 UPDATE,而且最近才这样做。您的古董版本确实在幕后执行了一个DELETE/INSERT 对。

VACUUMCLUSTER 是已批准的保持表大小可管理的方法。 CLUSTER 锁定表(至少在 7.3 中是这样)。您可能希望经常(每天多次)运行普通的 VACUUM 并在下类时间运行 CLUSTER。当然,这些频率取决于您的更新频率。

我使用 Postgresql 的经验是向上迁移很容易;转储/恢复每次都是第一次工作。

关于postgresql - Plpgsql 似乎正在删除和插入而不是更新 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029904/

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