【发布时间】:2011-08-27 03:48:38
【问题描述】:
我正在使用 postgreSQL 7.4。
我有一张大桌子,叫它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 语句在第一次调用每个键后会导致 UPDATE 而不是 INSERT。
由于每个 INSERT 的插入时间都会增加,因此我在 table_b 上尝试了 VACUUM FULL。插入时间更改回早期插入的大致时间。 table_b 的文件大小大大减少。在 VACUUM FULL 之后,插入时间再次开始增长。我不想在每次 INSERT 之后都做一个 VACUUM FULL 。
UPDATE 是否可能实际上是在 table_b 中执行 DELETE 和 INSERT?
【问题讨论】:
标签: postgresql plpgsql