2017-08-16 80 views
0

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

回答

0

请参考这个知道Different option to remove bloat from a table

真空不会删除膨胀,但真空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 testbloat; 

检查表真空后的尺寸施加真空膨胀的增加。大小仍然是85MB。

SELECT 'After Vacuum', pg_size_pretty(pg_relation_size('testbloat')); 

应用真空FULL放在桌子上

Vacuum FULL testbloat; 

真空FULL后检查表的大小。大小仍然是43MB。它得到了降低表膨胀是不存在

SELECT 'After Vacuum FULL ', pg_size_pretty(pg_relation_size('testbloat')); 
+0

感谢您的解释,关于声明真空FULL avee_dev.year1;什么是avee_dev.year1? – vkumar

+0

不好意思。我改变了它 –

+0

好吧。我正在使用talend工作,每小时更新并将记录插入和删除到20个表格中。应该以什么频率吸引桌子?我应该在插入,更新和删除之后立即吸尘吗? – vkumar

1

对于澄清:

真空的确取消了膨胀(表中的死者元组),并允许该空间被重新使用新的元组。

VACUUM和VACUUM FULL之间的区别在于FULL会重新编写relfiles(表存储)并回收操作系统的空间。

gp_toolkit.gp_bloat_diag不立即更新,但在更新表格的统计信息后更新ANALYZE后不久更新。

我只会建议您在表非常小或系统目录表增长不成比例的情况下运行VACUUM FULL,而您没有太多选项。

VACUUM FULL是一个非常昂贵的操作。 在非常大的表上可能会导致意外的运行时间,并且在此运行期间,表将始终处于独占锁定状态。

一般而言,频繁的VACUUM会使您的表格避免不必要的过大。死元组将被删除,空间将被重用。

如果你的桌子有很大的死角,你可能会想要重新组织 - 这是一种收回空间的较便宜的方法。

alter table <table_name> set with (reorganize=true) distributed (randomly -- or -- by (<column_names1>,<column_names2>....)

0

真空永远不会释放过期的行所占用的空间,而它标志着新行到同一表本身插入后可以重复使用的空间。因此,即使在运行真空后,桌子的大小也不会下降。

而不是完全使用真空,使用CTAS,它比真空充满速度更快,不像真空充满它,它不锁定pg_class表。

在CTAS操作之后,将表格重命名为旧的表格名称。