我试图摆脱使用临时表:
CREATE OR REPLACE FUNCTION test1(user_id BIGINT) RETURNS BIGINT AS
$BODY$
BEGIN
create temp table temp_table1
ON COMMIT DELETE ROWS
as SELECT table1.column1, table1.column2
FROM table1
INNER JOIN -- ............
if exists (select * from temp_table1) then
-- work with the result
return 777;
else
return 0;
end if;
END;
$BODY$
LANGUAGE plpgsql;
我希望立即或尽快删除行temp_table1
,这就是我添加ON COMMIT DELETE ROWS
的原因。显然,我收到了错误:
ERROR: relation "temp_table1" already exists
我尝试添加IF NOT EXISTS
,但我无法做到,我根本无法找到我正在寻找的工作示例。
你的建议?
答案 0 :(得分:11)
每次创建TEMP表之前的DROP表如下所示:
BEGIN
DROP TABLE IF EXISTS temp_table1;
create temp table temp_table1
-- Your rest Code comes here
答案 1 :(得分:2)
答案 2 :(得分:0)
临时表的问题是,删除和重新创建临时表会使pg_attribute严重膨胀,因此,一个阳光明媚的早晨,您会发现数据库性能下降,而pg_attribute 200+ gb却使您的数据库达到10gb。
因此,我们非常忙于具有> 500 rps的临时表,并通过nodejs进行异步i / o,因此,由于这个原因,pg_attribute变得非常繁琐。您所剩下的就是非常激进的吸尘功能,这会停止性能。 这里给出的所有答案都不能解决这个问题,因为它们都使pg_attribute严重膨胀。
所以解决方案很优雅
create temp table if not exists my_temp_table (description) on commit delete rows;
因此,您继续使用临时表并保存pg_attribute。