使用 Postgres SQL 中的存储过程删除子表中的子数据

问题描述 投票:0回答:1

我有一个名为

new_schema
的模式,其中包含一个表
result
。该表有很多具有继承性的子表,命名为
result_23
result_45

我有 35 亿行,数据库运行缓慢。其中一行有一个名为

new_date
的时间戳字段。这从“2022-01-01”开始。我想删除 2023-11-01 之前的所有行。

从父表中删除耗时太长。我尝试直接在 SP 中从子表中删除。如果有什么事情,我可以稍后继续工作。

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
来自循环中的所有子表。我执行此代码并显示正在工作(甚至需要很长时间才能使用大型子表),但是当我检查选择的某个已删除的表(数据)时,2022 年的数据和所有数据都保留在那里,没有删除。

我打印了“删除”的查询,我可以看到它是完美的:

上下文:SQL 语句“DELETE FROM new_schema.result_26 新日期在哪里 < '2023-11-01';"

我尝试在每个

COMMIT
之后应用
DELETE
,但这不起作用。我使用
postgres
用户执行 SP。

database postgresql stored-procedures plpgsql
1个回答
0
投票

实际上,这通常会附加到错误消息中:

CONTEXT: SQL statement "DELETE FROM new_schema.result_26 WHERE new_date < '2023-11-01';"

所以并不完全“完美”。您截断了最重要的前导部分。

无论哪种方式,您都想使用

PROCEDURE
而不是
FUNCTION
。在那里你可以发出
COMMIT
。参见:

可以像这样工作:

CREATE OR REPLACE PROCEDURE new_schema.delete_old_rows()  -- !!!
  -- no RETURNS clause  -- !!!
  LANGUAGE plpgsql AS
$func$
DECLARE
   _child text;
   _sql text;
   _row_ct int;
BEGIN
   FOR _child IN
      SELECT quote_ident(table_name)  -- !!!
      FROM   information_schema.tables
      WHERE  table_schema = 'new_schema'
      AND    table_name LIKE 'result_%'
   LOOP
      _sql := 'DELETE FROM new_schema.' || _child || 'WHERE new_date < ''2023-11-01''';
      EXECUTE _sql;
      GET DIAGNOSTICS _row_ct = ROW_COUNT;

      COMMIT;  -- !!!
      RAISE NOTICE '% rows deleted from table: %', _row_ct, _child;
   END LOOP;
END
$func$;

致电(重要!):

CALL new_schema.delete_old_rows();
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.