各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でレコードを削除をすべきかという話もあり、なんとも言えない。
参考:テーブルのバキューム処理
参考リンク
MySQL 5.1 リファレンスマニュアル OPTIMIZE TABLE 構文
PostgreSQL 7.2.3 リファレンスマニュアル VACUUM
PostgreSQL 9.2.4文書 定常的なバキューム作業