logo サブスレッド

drop tableの後にvacuumしなくてもよいのでは

PostgreSQLではレコードを更新・削除した時に不要なタプルが溜まっていきます。
そこでvacuumという作業をしてやる必要があります。
これで不要なタプルを処理し、ディスク容量を効率的に使えるようになるのです。
(今回はvacuumの内容についてはあまり言及しません)

レコードを更新・削除していくとタプルが蓄積されvacuumが必要になるということは理解しましたが、「テーブルを削除したときはどうなるのか」という疑問に当たってしまいました。
果たして、テーブルの削除はレコードの削除と同様に不要なタプルが溜まっていってしまうのでしょうか。
https://www.postgresql.jp/document/9.6/html/routine-vacuuming.html
によると

PostgreSQLのVACUUMコマンドは以下の理由により定期的にそれぞれのテーブルを処理しなければなりません。
1. 更新、あるいは削除された行によって占められたディスク領域の復旧または再利用。

と記載があります。vacuumの対象は「行」であると言及されています。
ということは、もしかしてテーブル自体の削除ではvacuumは必要ないのでは?ということで試してみました。
DBの容量はこんな感じ。

postgres=# \l+
                                                                     List of databases
      Name      |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   |  Size   | Tablespace |                Description
----------------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------
 droptable_test | postgres | UTF8     | en_US.utf8 | en_US.utf8 |                       | 415 MB  | pg_default |

容量を確認できたところで、drop tableします。

droptable_test=# drop table hogehoge_test_table;

そして、再度DBの容量を確認します。

DROP TABLE
droptable_test=# \l+
                                                                     List of databases
      Name      |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   |  Size   | Tablespace |                Description
----------------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------
 droptable_test | postgres | UTF8     | en_US.utf8 | en_US.utf8 |                       | 301 MB  | pg_default |

おお!容量が減っている!
なるほど、これはタプルが残っていることも無さそうな感じです。
念の為、pg_stat_user_tablesテーブルの内容を確認しましたがhogehoge_test_tableはリストに上がりませんでした。

ひとまず、drop tableではvacuumは必要無いということで結論付けて今回は終わりにしようと思います。

現在の位置:サブスレッド ホーム > 技術ブログ > drop tableの後にvacuumしなくてもよいのでは