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
,因为过程本质上是一个事务。
我的目标是创建一个存储过程,循环遍历 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
,因为过程本质上是一个事务。