不能在greenplum真空表

时间:2017-08-16 06:39:47

标签: greenplum

我在Greenplum中创建了一个表并对其执行插入更新删除操作。我已在桌面上运行vacuum命令,显示它已成功运行。 但是当我运行命令select * from gp_toolkit.gp_bloat_diag;时。它显示相同的表名。 反复运行vacuum后,还会从命令select * from gp_toolkit.gp_bloat_diag中显示列表中的表名; 我应该如何确保表没有任何膨胀并正确吸尘?

3 个答案:

答案 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操作之后,将表重命名为旧表名。