【PostgreSQL】REINDEX(インデックスの再構築)の概要と使い方を簡単に解説!

postgresql-reindex-top PostgreSQL
スポンサーリンク

今回は、REINDEXについて解説します。ちなみに公式マニュアルは以下を参照。

REINDEX

それではいってみましょう!

スポンサーリンク

REINDEXは何のために実行するのか?

インデックスが膨張してディスク領域を圧迫することを防ぐために実行する。通常インデックスを削除するとその領域は回収されるのだが、一部回収されない領域がでてくる。それが蓄積されると使用されていない領域でディスクが圧迫される事象が発生してしまう。

それはイカン!ということで、REINDEX(インデックスの再構築)を実行して、不要領域を回収しディスク領域を空ける。

実際にシュミレーション

今回対象のテーブル

対象テーブル:test

CREATE TABLE test (
  id integer,
  name text
);

対象インデックス:idx_id01(id列に作成する。)

CREATE UNIQUE INDEX idx_id01 ON test(id);

いざシュミレーション!

1.初期データを投入する。

INSERT INTO test (id, name) SELECT id, 'this is test' FROM GENERATE_SERIES(1, 500000) AS id;

GENERATE_SERIES関数を利用して50万件のデータを投入する。

2.ページサイズを確認する。

SELECT relname, relpages FROM pg_class WHERE relname IN ('test', 'idx_id01');

 relname  | relpages
----------+----------
 test     |     3185 
 idx_id01 |     1374
(2 行)

ページサイズが「testテーブル」、「idx_id01インデックス」の両方で増えていることが分かる。

3.データを消して、VACUUMを行う。

データを消すだけだと不要領域が回収されないので、VACUUMも行う。

DELETE FROM test WHERE id BETWEEN 1 and 500000;

VACUUM ANALYZE test;

さて、ページサイズを確認する。すると、testテーブルのみサイズが減少している。

SELECT relname, relpages FROM pg_class WHERE relname IN ('test', 'idx_id01');

 relname  | relpages
----------+----------
 test     |        0
 idx_id01 |     1374 ←インデックスのページサイズが減っていない!
(2 行)

テーブルにデータが無いため、インデックスも不要なページがあるはずなのに。。やはり不要領域が回収されていない模様。

6.満を持してREINDEXを実行する。

REINDEX INDEX idx_id01;

ページサイズを確認するとidx_id01のサイズも減っていることが分かる。

SELECT relname, relpages FROM pg_class WHERE relname IN ('test', 'idx_id01');
 relname  | relpages
----------+----------
 test     |        0
 idx_id01 |        1
(2 行)

以上、REINDEXでした!

REINDEXはいくつか制約があるので注意!

・インデックスの元になるテーブルに対する書き込みがロックされる。

・処理中のインデックスに対する読み込みがブロックされる。

PostgreSQL
スポンサーリンク
シェアする
katsuyaをフォローする
Study Infra

コメント

タイトルとURLをコピーしました