2017-08-16 2 views
0

私はGreenplumにテーブルを作成し、そこに挿入更新更新操作を実行しました。私はテーブル上でvacuumコマンドを実行し、正常に実行されたことを示しています。 しかし、私はコマンドselect * from gp_toolkit.gp_bloat_diag;を実行します。同じテーブル名を表示します。 真空を繰り返し実行した後も、コマンドselect *からgp_toolkit.gp_bloat_diagのリストにテーブル名を表示します。 テーブルに盛り上がりがなく真空が適切であることを確認する方法を教えてください。greenplumの真空テーブルにアクセスできない

答えて

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)); 

テーブルのサイズを確認します。サイズは43メガバイト

SELECT 'After Inserting data',pg_size_pretty(pg_relation_size('testbloat')); 

を更新した後、テーブルのサイズを確認するテーブル

UPDATE testbloat 
SET dat_year = dat_year+1; 

内のすべてのレコードを更新しています。サイズは85MBです。それが原因VACUUM後のテーブルのサイズを確認するテーブル

Vacuum testbloat; 

に真空を適用するため、更新操作

SELECT 'After updating data',pg_size_pretty(pg_relation_size('testbloat')); 

で引き起こされた鼓脹症の増加しています。サイズはまだ85MBです。

Vacuum FULL testbloat; 

は、VACUUM FULLの後にテーブルのサイズを確認するテーブルの上にFULL VACUUMを適用

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

。サイズはまだ43MBです。テーブルの肥大化が明確にするため

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

説明のため、ありがとうございますVacuum FULL avee_dev.year1; avee_dev.year1とは何ですか? – vkumar

+0

申し訳ありません。私はそれを変更しました –

+0

大丈夫です。私はtalendジョブと1時間ごとにレコードを更新し、レコードを20個のテーブルに挿入して削除しています。テーブルを真空にしなければならない頻度は何でしょうか?挿入、更新、削除の直後、または1日に一度真空引きする必要がありますか? – vkumar

1

ではなかったとして、それが小さくてしまった:

VACUUMは、膨張(表中の死んだタプル)を削除し、スペースは新しいタプルで再利用することがことができます。

VACUUMとVACUUM FULLの違いは、FULLがrelfiles(テーブルストレージ)を再書き込みし、OSの領域を再利用することです。

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

真空が期限切れの行が占有するスペースではなく、それはそれらのスペースが同じテーブル自体への新しい行の後の挿入のために再利用されるようにマークリリースはありません。したがって、あなたがvacuumを実行した後でさえ、テーブルのサイズは下がらないでしょう。代わりに、完全な真空使用の

、CTASを使用し、それは完全な真空よりも高速で、真空フルとは違ってそれはpg_classのテーブルのロックを保持していません。

CTAS操作の後、テーブルの名前を古いテーブル名に変更します。

関連する問題