各DBにおけるVACUUM(OPTIMIZE)コマンドの使い方

各DBにおけるVACUUM(OPTIMIZE)コマンドの使い方。



各DBにおけるVACUUMコマンドの使い方


各DBにおけるVACUUM(OPTIMIZE)コマンドの用途と使いどころについて調べてみた。特に、MySQL, PostgreSQL, Hive, Redshiftについて。



VACUUMコマンドとは


DBによって微妙に意味が違うものの、データのフラグメンテーションの解消、レコードの削除によって不要になった領域の回収、を行うコマンドをVACUUMコマンドと呼ぶ。実行すると、フラグメンテーションが解消され、テーブルスキャンが高速化する。


DBによってコマンド名が異なっており、PostgreSQLはVACUUM、MySQLはOPTIMIZE(内部的にはALTER?)と呼ばれる。


基本的には追記型のDBで重要なコマンドであり、PostgreSQL(追記型)では定期的に実行する必要がある。MySQL(追記型ではない)ではほとんど実行する必要はない


※注記

ただし、MySQLの場合もロールバックセグメントのパージに同等の処理が必要であるため、大量のレコードを削除した場合は明示的に実行した方がいいのかもしれない。



各DBにおけるVACUUMコマンド


特に、どんな時に必要なのか、手動で実行する必要があるのか、について。



MySQL(特にInnoDB)

公式ドキュメントには明示的に実行する必要はないと書いてある。ただし、大量のレコードを削除した時にはやった方がいいのかもしれない。

参考:大人のためのInnoDBテーブルとの正しい付き合い方。



PostgreSQL

公式ドキュメントには定期的(毎日)やった方がいいと書いてある。

VACUUM(とANALYZE)を自動でやってくれる設定もあるらしい。

参考:定常的なバキューム作業



Hive

VACUUMコマンドはないっぽい。そもそもHiveテーブルはDFS上のファイルなので「削除された領域の回収」が不要だからかな。



Redshift

VACUUMコマンドはある。ただし、不要な領域の回収ではなく、実質的には削除と更新になると公式ドキュメントには書いてある。

明示的に「削除された領域の回収」をすべきかどうか以前に、そもそもこれ系のDBでレコードを削除をすべきかという話もあり、なんとも言えない。

参考:テーブルのバキューム処理



参考リンク


大人のためのInnoDBテーブルとの正しい付き合い方。

MySQL 5.1 リファレンスマニュアル OPTIMIZE TABLE 構文

PostgreSQL 7.2.3 リファレンスマニュアル VACUUM

PostgreSQL 9.2.4文書 定常的なバキューム作業

Amazon Redshift テーブルのバキューム処理


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール