【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度登録して、相談に乗ってもらうことがオススメです。

いざシュミレーション!

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はいくつか制約があるので注意!

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

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

柔軟性と高収入を両立。Midworkで、理想のワークスタイルを実現
Midworks

Midworkはフリーランスエンジニアのために、高単価からフルリモートまで、多様な働き方をサポートするプロジェクトマッチングサービスです。専任カウンセラーによる手厚いキャリアサポートも、特徴の一つ。これらのサービスを通じて、あなたのキャリアを次のレベルへ。

プロフィール
この記事を書いた人
katsuya

SESからキャリアをスタートし、現在はフリーランスとして活動しています。フリーランスになってから6年で年収1,000万円を達成しました。「Study Infra」では、今までの経験やITインフラに関する情報を発信中です。

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

コメント

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