更新操作 (INSERT VALUES、UPDATE、DELETE、および ALTER TABLE ADD COLUMN) をシステム上で実行した場合、不要なデータが システムテーブルや更新データテーブルに残ってしまう可能性があります。 不要データはシステムパフォーマンスを低下させ、 ディスクスペースの多くを占有します。 このようなデータは、以下の方法で 定期的に消去することを推奨します。

テーブルをロックしないで不要データを消去する

テーブルをロックすることなく、不要データを消去することができます。 その方法は次のとおりです。

  • コマンド : 全てのデータベースに接続し、データベースオーナーとしてログインします。 そして、 VACUUM コマンドを実行します。

  • 頻度: 少なくとも 1 日 1 回。

    • データがリアルタイムで更新されている場合 (INSERT VALUES、UPDATE、 DELETE 操作が連続的に実行されている場合)、 VACUUM コマンドを 2 時間ごとに実行することを推奨します。
    • データが一日一回、一括更新される場合、 一括更新が行われた後に、そのコマンドを実行できます。
  • システムへの影響: テーブルはロックされず、テーブルを正常に読み書きすることができます。しかし、CPU と I/O の使用量が増加するため、クエリのパフォーマンスに影響する可能性があります。

  • たとえば、次のような Linux Shell スクリプトファイルに 定期的な crontab タスクを実行します。

  1. #!/bin/bashexport PGHOST=myinst.gpdb.rds.tbsite.netexport PGPORT=3432export PGUSER = myuserexport PGPASSWORD = mypass#do not echo command, just get a list of dbdblist=psql -d postgres -c "copy (select datname from pg_stat_database) to stdout"for db in $dblist ; do #skip the system databases #skip system databases continue fi echo processing $db #vacuum all tables (catalog tables/user tables) psql -d $ db -e -a -c "VACUUM;"done

メンテナンス中の不要データの消去

サービスが中断した場合、サービスのメンテナンス中にすべての不要データを消去できます。 その方法は次のとおりです。

  • コマンド: すべてのデータベースに接続し、 データベースオーナーとしてログインします。すべての操作に対してオーナー権限を持つ必要があります。

    1. REINDEX SYSTEM <database name> コマンドを実行します。
    2. VACUUM FULL <table name>REINDEX TABLE <table name> の順でコマンドをすべてのデータテーブル (非システムテーブル) において実行します。
  • 頻度:少なくとも週 1 回。 毎日データが更新されるのであれば、 1 日 1 回はこのコマンドを実行します。

  • システムへの影響: VACCUM FULL あるいは REINDEX は、 テーブルをロックし読み書きできないようにします。 これにより、CPU への負荷や I/O の利用が増える可能性があります。

  • たとえば、次のような Linux Shell スクリプトファイルに 定期的な crontab タスクを実行します。

  1. #!/bin/bashexport PGHOST=myinst.gpdb.rds.tbsite.netexport PGPORT=3432export PGUSER = myuserexport PGPASSWORD = mypass#do not echo command, just get a list of dbdblist=psql -d postgres -c &amp;quot;copy (select datname from pg_stat_database) to stdout&amp;quot;for db in $dblist ; do #skip system databases #skip system databases continue fi echo processing db “$db” #do a normal vacuum psql -d $ db -e -a -c &quot;VACUUM;&quot; #reindex system tables firstly psql -d $ db -e -a -c &quot;REINDEX SYSTEM $ db;&quot; #use a temp file to store the table list, which could be vary large cp / dev / null tables.txt #query out only the normal user tables, excluding partitions of paren-USt tables psql -d $db -c “copy (select ‘\”‘||tables.schemaname||’\”.’ || ‘\”‘||tables.tablen-USame||’\”‘ from (select nspname as schemaname, relname as tablen-USame from pg_catalog.pg_class, pg_catalog.pg_namespace, pg_catalog.pg_roles where pg_class.relnamespace = pg_namespace.oid and pg_namespace.nspowner = pg_roles.oid and pg_class.relkind=’r’ and (pg_namespace.nspname = ‘public’ or pg_roles.rolsuper = ‘false’ ) ) as tables(schemaname, tablen-USame) left join pg_catalog.pg_partitions on pg_partitions.partitionschemaname=tables.schemaname and pg_partitions.partitiontablen-USame=tables.tablen-USame where pg_partitions.partitiontablen-USame is null) to stdout;” > tables.txt while read line; do #some table name may contain the $ sign, so escape it line=echo $line |sed 's/\$/\\\$/g' echo processing table “$line” echo processing table “$line” psql -d $db -e -a -c “VACUUM FULL $line;” #reindex the table to reclaim index space psql -d $db -e -a -c “REINDEX TABLE $line;” done <tables.txtdone
  1. </article>
  2. </main>