gpt4 book ai didi

postgresql - 不能从函数或多命令字符串中执行 VACUUM

转载 作者:行者123 更新时间:2023-11-29 11:15:50 25 4
gpt4 key购买 nike

我使用 PL/pgSQL 编写了一个脚本,我在 pgAdmin III 中运行。该脚本删除现有的数据库内容,然后为所需的测试场景(通常是各种类型的负载测试)添加一堆“示例”数据。加载数据后,我想“真空分析”受影响的表,以恢复已删除记录的空间并准确反射(reflect)新内容。

我可以使用各种解决方法(例如,手动执行 VACUUM ANALYZE,在脚本中为各种结构包含删除/创建语句等)但是,我真正想做的是:

DO $$
BEGIN
-- parent table
FOR i IN 1..10000 LOOP
INSERT INTO my_parent_table( ... ) VALUES ...;
END LOOP;

VACUUM ANALYZE my_parent_table;

-- child table
FOR i IN 1..50000 LOOP
INSERT INTO my_child_table( ... ) VALUES ...;
END LOOP;

VACUUM ANALYZE my_child_table;
END;
$$;

当我运行它时,我得到:

ERROR:  VACUUM cannot be executed from a function or multi-command string

然后我尝试像这样将 vacuum 语句移动到末尾:

DO $$
BEGIN
-- parent table
FOR i IN 1..10000 LOOP
INSERT INTO my_parent_table( ... ) VALUES ...;
END LOOP;

-- child table
FOR i IN 1..50000 LOOP
INSERT INTO my_child_table( ... ) VALUES ...;
END LOOP;
END;
$$;

VACUUM ANALYZE my_parent_table;
VACUUM ANALYZE my_child_table;

这给了我同样的错误。有什么办法可以将真空分析合并到添加数据的同一脚本中吗?

我正在使用 PostgreSQL v 9.2。

最佳答案

如果您使用“执行查询”按钮从 pgAdmin3 查询窗口运行它,那么会将整个脚本作为一个字符串发送到服务器。

如果你从查询窗口的“execute pgScript”按钮执行它,它会单独发送命令,这样就可以了,除了它不能容忍匿名 block 的 DO 语法。您必须创建一个函数来执行当前的匿名工作,然后使用类似以下内容调用“执行 pgScript”:

select inserts_function();
VACUUM ANALYZE my_parent_table;
VACUUM ANALYZE my_child_table;

关于postgresql - 不能从函数或多命令字符串中执行 VACUUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21763164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com