我在Greenplum中创建了一个表并对其执行插入更新删除操作。我已在桌面上运行vacuum命令,显示它已成功运行。
但是当我运行命令select * from gp_toolkit.gp_bloat_diag;
时。它显示相同的表名。
反复运行vacuum后,还会从命令select * from gp_toolkit.gp_bloat_diag中显示列表中的表名;
我应该如何确保表没有任何膨胀并正确吸尘?
答案 0 :(得分:1)
澄清:
VACUUM确实删除了膨胀(表中的死元组),并允许新元组重用该空间。
VACUUM和VACUUM FULL之间的区别在于FULL重写了relfiles(表存储)并回收了操作系统的空间。
gp_toolkit.gp_bloat_diag不会立即更新,但会在分析表的统计数据后更新后立即更新。
如果表格非常小,或者如果系统目录表格不成比例,那么我建议您运行VACUUM FULL,而您没有很多选项。
VACUUM FULL是一项非常昂贵的操作。 在一个非常大的表上可能会导致意外的运行时间,在此运行期间,表将一直处于独占锁定状态。
通常,频繁的VACUUM会使您的桌面不会变得不必要地变大。死元组将被删除,空间将被重用。
如果你有一个有大量膨胀和大量死角的大桌子,你可能想要重新组织 - 这是回收空间的一种较便宜的方式。
alter table <table_name> set with (reorganize=true) distributed (randomly -- or -- by (<column_names1>,<column_names2>....)
答案 1 :(得分:0)
请参考此处了解Different option to remove bloat from a table
VACUUM不会消除臃肿但VACUUM FULL会消失。请查看以下示例
表格创建:
DROP TABLE IF EXISTS testbloat;
CREATE TABLE testbloat
(
id BIGSERIAL NOT NULL
, dat_year INTEGER
)
WITH (OIDS = FALSE)
DISTRIBUTED BY (id);
将1M记录插入表中:
INSERT INTO testbloat (dat_year) VALUES(generate_series(1,1000000));
检查表格的大小。大小为43MB
SELECT 'After Inserting data',pg_size_pretty(pg_relation_size('testbloat'));
更新表格中的所有记录
UPDATE testbloat
SET dat_year = dat_year+1;
更新后检查表的大小。大小是85MB。由于更新操作引起的膨胀,它增加了
SELECT 'After updating data',pg_size_pretty(pg_relation_size('testbloat'));
在表格上应用VACUUM
Vacuum testbloat;
在VACUUM之后检查表的大小。大小仍然是85MB。
SELECT 'After Vacuum', pg_size_pretty(pg_relation_size('testbloat'));
在表格上应用VACUUM FULL
Vacuum FULL testbloat;
在VACUUM FULL之后检查表的大小。大小仍然是43MB。由于桌子膨胀不存在,它减少了
SELECT 'After Vacuum FULL ', pg_size_pretty(pg_relation_size('testbloat'));
答案 2 :(得分:0)
Vacuum永远不会释放过期行占用的空间,而是标记要重用的空间,以便以后将新行插入到同一个表本身。因此,即使在你进行真空接种后,桌子的大小也不会下降。
不是使用真空,而是使用CTAS,它比真空充分快,而且与真空不同,它不会在pg_class表上持有锁。
在CTAS操作之后,将表重命名为旧表名。