今回は、Silverの「運用管理 - 基本的な運用管理作業(VACUUM、ANALYZEの目的と使い方)」からの出題です。
VACUUM FULLは処理対象のテーブルの排他的ロックを取得するため、通常のテーブルの読み書きの処理と競合が発生する。VACUUMは排他的ロックを取得しない。
VACUUM FULLを実行すると通常はテーブルを構成するファイルのサイズが小さくなるが、VACUUMを実行しても通常はテーブルを構成するファイルのサイズは変わらない。
OSのコマンドラインから vacuumdb コマンドを発行することで VACUUM を実行できるが、VACUUM FULL はコマンドラインからは実行できない。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2020年9月2日
PostgreSQLでは、テーブルの行を更新あるいは削除したとき、その行が占めていた領域を物理的には削除せず、代わりに削除済みのフラグをセットします。これはマルチバージョニングの機能を実現するための鍵となる仕組みなのですが、テーブルの更新が繰り返されると、削除済みの領域が増大し、テーブルを構成するファイルの物理的サイズが大きくなる、という問題があります。
これに対処するための機能がVACUUMで、削除済みの領域を回収し、再利用可能にします。つまり、そのテーブルに次にINSERTやUPDATEが実行されたときに、回収された領域にデータが入るため、テーブルを構成するファイルのサイズの増大を回避できます。
通常のVACUUMは削除済みの領域を回収するだけなのでファイルの物理的サイズは小さくなりませんが、VACUUM FULLを実行すると、データの詰め直しをして使用中のデータだけで構成されるデータファイルを作成するため、処理後のデータファイルのサイズは小さくなります。ただし、この処理の実行中はテーブルの排他的ロックを取得するため、テーブルに対する読み書きの処理はブロックされます。
VACUUM、VACUUM FULLのいずれも、データベース内の特定のテーブルのみを対象とすることも、全テーブルを対象とすることもできます。ANALYZEオプションを付けて実行すると、VACUUM の終了後に ANALYZE の処理を行いますが、オプションを指定しなければ VACUUM の処理だけを行います。通常は VACUUM ANALYZE のセットで実行するのが望ましいでしょう。
OSのコマンドラインから vacuumdb コマンドを発行することでも VACUUM を実行できます。-f オプションを指定すれば、VACUUM FULL を実行できます。
したがって正解は C と D です。
VACUUMはPostgreSQLの運用管理において極めて重要なコマンドです。autovacuumの機能により自動的に実行されるため、手作業でVACUUMを実行することは現在ではほとんどないかもしれませんが、その原理については把握しておきましょう。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.