Pivotal Knowledge Base

フォローする

テーブルの肥大化を抑える様々なオプションについて

環境

Pivotal Greenplum(GPDB)

目的

本ドキュメントでは、テーブルの肥大化を抑える様々なオプションについて記載する。

テーブルの肥大化について理解を深めるにあたり、データベーステーブルが実際に肥大化しているのか確認するため、こちらの記事こちらの記事を参照のこと。

解決策

以下、テーブルの肥大化を除去することを可能とする様々な方法について述べる。

1. VACUUM FULL

この方法は領域確保のためのもっとも時間のかかる手段で、VACUUM FULL コマンドを実行した際には、テーブルにおける各行の入れ替えが行われるので、非常に多くの行が存在する場合は、当該コマンド完了までに予測不可能なほど長い時間がかかることがある。

肥大化したテーブルに対する VACUUM FULL 実行コマンドラインは以下である。

VACUUM FULL <スキーマ名>.<テーブル名>;

データベースにおける任意の肥大化したカタログテーブル(すなわち、pg_catalog スキーマ配下の全てのテーブル)に対しては、これがテーブル肥大化を除去する唯一の方法である。したがって、極度のカタログテーブル肥大化の除去には、非常に時間がかかる可能性がある。

2. 再分散配置

この方法は、本解決策リストの中では最も高速なものの一つで、再分散配置コマンドを実行すると、内部的にはデータベースは新しいファイルを生成し、そこへ既存のデータのロードを開始、それが完了すると古いファイルを削除する。

テーブル肥大化の除去のために、テーブルの再分散配置を行う方法については、こちらの記事を参照されたい。

3. CTAS

CTAS もまた、データベースの肥大化を高速に除去するもう一つの方法で、上述の二つの方法では処理の実行にあたり必要であるテーブルロック(排他ロック)を回避する一助となる。したがって、主要テーブルのメンテナンス中に、エンドユーザーによる当該テーブルの使用を可能とする。

デメリットとしては、処理実行にあたり、以下のような多くの手順を伴うことである。

  • こちらの記事で言及されている手順に沿って、テーブルの DDL を取得する。こちらを活用することで、リレーションを伴うような INDEX といった全てのサブオブジェクトの取得、並びに、当該テーブルのユーザーに与えられた権限のリスト確認の一助となる。
  • DDL をファイルとして取得後、任意のテキストエディターにある検索・置換オプションを使用して、<肥大化したテーブル名> を <新規のテーブル名> に置換し、データベースにオブジェクトを生成するため psql 上で更新した DDL ファイルを実行する。
  • 次に、以下の一連の手順に従う。
INSERT INTO <schema-name>.<new-table-name> SELECT * FROM <schema-name>.<bloated-table-name>;
ALTER TABLE <schema-name>.<bloated-table-name> RENAME TO <old-table-name>;
ALTER TABLE <schema-name>.<new-table-name> RENAME TO <bloated-table-name>;
-- Once users confirm everything is good.
DROP TABLE <schema-name>.<bloated-table-name>;

4. バックアップとリストア

こちらは、テーブルの肥大化を除去するもう一つの方法で、テーブルのバックアップ作業とリストア作業を伴う。この方法を実現するために、以下のような様々なツールを使用することができる。

  • gpcrondump / gpdbrestore
  • gp_dump / gp_restore
  • pg_dump / pg_restore
  • COPY .. TO .. / COPY .. FROM ..

これらの管理ユーティリティーについての詳細情報は、ドキュメントを参照されたい。

あるいは、ディスク容量が少ない場合はこちらにあるように、バックアップユーティリティーと psql を組み合わせて使用することも可能である。

注意:

  • テーブルやリレーションの肥大化に陥ることを避けるため、データベースに対して頻繁に VACUUM を実行しているか確認されたい。VACUUM や VACUUM FULL について理解を深めるためには、こちらを確認されたい。
  • カタログテーブルは、VACUUM FULL によってのみ肥大化除去することができる。
  • インデックスに対する肥大化の除去を行うにためには、以下のコマンドを使用する。
REINDEX INDEX <インデックス名>;
あるいは
REINDEX TABLE <肥大化したテーブル名>;
  • 上述の作業を行った後は、テーブルのデータスキャン実行計画をたてる際に、データベースが最新の統計情報を保持し、オプティマイザーが変更内容を認識するよう、テーブルに対して ANALYZE を実行すること。

コメント

Powered by Zendesk