我有一个名为new_schema
的模式,其中有一个表result
.该表有许多具有继承性的子表,命名为result_23
、result_45
等.
我有35亿行,而数据库运行缓慢.一行有一个名为new_date
的时间戳字段.这从"2022-01- 01"开始.我想删除之前的所有行:2023-11-01.
从父表中删除需要太长时间.我try 直接在SP中从子表中删除,由postgres
个超级用户执行.如果发生什么事,我可以稍后继续工作.
CREATE OR REPLACE FUNCTION new_schema.delete_old_rows()
RETURNS TABLE (child_table text)
LANGUAGE plpgsql
AS $function$
DECLARE
child_table text;
sql_query text;
BEGIN
FOR child_table IN
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'new_schema'
AND table_name LIKE 'result_%'
loop
sql_query := 'DELETE FROM new_schema.' || child_table || ' WHERE new_date < ''2023-11-01'';';
EXECUTE consulta_sql;
RAISE NOTICE 'Data deleted in table: %', child_table;
END LOOP;
END
$function$;
循环中每个子表的I DELETE
,而且似乎有效(尽管对于大表来说需要很长时间).但当我判断SELECT
时,2022年的数据仍然存在.
打印查询字符串时,DELETE
看起来很完美:
==同步,由Elderman更正==@elder_man 其中new_date<;‘2023-11-01’;"
我试图在每个DELETE
后申请COMMIT
,但这不起作用.