AWS Redshift 创建一个存储过程来执行手动清理

AWS Redshift create a stored procedure to perform a manual vaccum

我的目标是创建一个存储过程,循环遍历 select 语句,该语句将识别需要 vacuum 的表。如果我能让它工作,我会从 Lambda 调用它。这些是我到目前为止的想法和代码。

CREATE OR REPLACE PROCEDURE vac_an (rs_out INOUT refcursor)
AS $$
BEGIN
   OPEN rs_out FOR SELECT 'VACUUM FULL ' + "schema" + '.' + "table" + ';' AS command
FROM svv_table_info
WHERE (unsorted > 5 OR empty > 5)
      AND size < 716800;
END;
$$ LANGUAGE plpgsql;

这是一个开始。它会编译,但不会执行游标构建的实际命令,即:

VACUUM FULL SCHEMA.TABLE;

我想我可以这样称呼它:

CALL sample_cursor_test ();

我的第二个想法是这样的:

CREATE PROCEDURE vac_an()
AS $$
DECLARE
tlist RECORD;
BEGIN
FOR tlist IN EXECUTE 'SELECT 'VACUUM FULL ' + "schema" + '.' + "table" + ';' AS command FROM svv_table_info WHERE (unsorted > 5 OR empty > 5) AND size < 716800;'
LOOP
EXECUTE tlist;
END LOOP;
END;
$$ LANGUAGE plpgsql;

然而这给了我:

ERROR: missing "LOOP" at end of SQL expression
  Where: compile of PL/pgSQL function "vac_an" near line 4

我觉得代码差不多了我只需要遍历这个光标:

SELECT 'VACUUM FULL ' + "schema" + '.' + "table" + ';' AS command
FROM svv_table_info
WHERE (unsorted > 5 OR empty > 5)
      AND size < 716800;

并逐行执行输出。

你能帮忙吗?

您不能从事务中调用 VACUUM,这意味着您不能从过程中调用 VACUUM,因为过程本质上是一个事务。