我用PL/pgSQL编写了一个脚本,在pgAdmin III中运行。该脚本会删除现有的数据库内容,然后添加一些“示例”数据以进行所需的测试场景(通常是各种类型的负载测试)。加载完数据后,我想要对受影响的表执行“vacuum analyze”,既可以从已删除记录中恢复空间,也可以准确地反映新内容。
我可以使用各种变通方法(例如手动执行VACUUM ANALYZE,将各种结构的drop/create语句包含在脚本中等),但我真正想做的是:
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
于是我尝试将吸尘器语句移动到末尾,像这样:
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;
这给了我同样的错误。有没有办法将vacuum分析纳入到添加数据的同一脚本中?
我正在使用PostgreSQL v 9.2。
分析
本身应该就足够了。 - user330315insert
之前执行vacuum analyze
,就在delete
(或truncate
)之后立即执行,这样可以使其瞬间完成。 - Clodoaldo NetoANALYZE
,但将其留给自动清理来优雅地释放空间(只需确保为大型表配置了自动清理阈值)。 - Duncanmoo