2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PostgreSQL 入門Advent Calendar 2023

Day 18

【PostgreSQL】VACUUMについて

Last updated at Posted at 2023-12-17

初めに

PostgreSQLでは、データの更新や削除が行われると、「デッドタプル」と呼ばれる不要なデータがデータベース内に残ることがあります。これらを効率的に削除し、データベースのパフォーマンスを最適化するために使用されるのがVACUUMコマンドです。

VACUUMとは?

PostgreSQLでは、レコードの更新や削除を行うと、旧版のレコード(デッドタプル)がデータベース内に残ります。これはPostgreSQLがMVCC(Multi-Version Concurrency Control)という方式を採用しているためで、これにより複数のトランザクションが同時に行われても一貫性を維持することができます。

しかし、これらのデッドタプルが増えると、ディスクスペースの無駄になるだけでなく、テーブルのスキャン速度を低下させる原因ともなります。VACUUMコマンドはこれらのデッドタプルを削除し、そのスペースを再利用可能にすることで、データベースのパフォーマンスを改善します。

VACUUMの使い方

VACUUMコマンドは非常に簡単に使用することができます。基本的な形式は以下の通りです。

VACUUM table_name;

このコマンドを実行すると、指定したテーブルに対してVACUUMが行われます。

なお、VACUUMは通常、データベースの管理者やスーパーユーザーが実行します。ただし、テーブル所有者でもVACUUMを実行することができます。

VACUUMのオプション

VACUUMコマンドはいくつかのオプションを持っており、その挙動を柔軟に制御することができます。

  • VACUUM VERBOSE:このオプションを使用すると、VACUUMが行う作業の詳細な情報が表示されます。デバッグやパフォーマンスチューニングに役立ちます。
postgres=# VACUUM VERBOSE;
INFO:  vacuuming "public.accounts"
INFO:  table "accounts": found 0 removable, 0 nonremovable row versions in 0 out of 0 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 733
Skipped 0 pages due to buffer pins, 0 frozen pages.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO:  vacuuming "pg_catalog.pg_statistic"
INFO:  table "pg_statistic": found 0 removable, 406 nonremovable row versions in 18 out of 18 pages
~~~ 省略 ~~~
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 733
Skipped 0 pages due to buffer pins, 0 frozen pages.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.01 s.
VACUUM
  • VACUUM FULL:通常のVACUUMはデッドタプルを削除し、そのスペースを再利用可能にしますが、ディスクスペースをOSに返すことはありません。それに対してVACUUM FULLはテーブルを再構築し、不要なスペースをOSに返します。ただし、VACUUM FULLはテーブルをロックするため、長時間の実行は避けるべきです。
postgres=# VACUUM FULL;
VACUUM
  • VACUUM ANALYZE:このオプションを使用すると、VACUUMの後にテーブルの統計情報を更新するANALYZEが実行されます。これにより、クエリプランナがより効率的な実行計画を作成することが可能になります。
postgres=# VACUUM ANALYZE;
VACUUM

AUTOVACUUM

PostgreSQLにはAUTOVACUUMという機能もあり、これはデータベースが自動的に定期的にVACUUMANALYZEを実行する機能です。これにより、データベース管理者が手動でVACUUMを行う手間を省くことができます。

しかし、AUTOVACUUMの設定は適切に調整する必要があります。データベースのサイズやトラフィック、ハードウェアの性能など、システムの特性に応じてAUTOVACUUMのパラメータ(例えば、autovacuum_vacuum_scale_factorautovacuum_vacuum_thresholdなど)を調整することが重要です。

まとめ

PostgreSQLのVACUUMコマンドについて簡単に紹介しました。VACUUMはPostgreSQLのパフォーマンスを維持するために重要な作業であり、適切に使用することでデータベースの健全性とパフォーマンスを確保することができます。また、VACUUMのオプションを理解し、適切に使用することで、より柔軟かつ効率的にVACUUMを行うことができます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?