PostgreSQLはバキュームしてもインデックスは対象ではなく、最適化されない。
ほっとくと肥大化していき、遅延が発生する
インデックス単位
pg_relation_size('インデックス名');
テーブル単位
pg_indexes_size('テーブル名');
但しインデックス作成時はテーブルロックしてしまう。
REINDEX DATABASE データベース名;
REINDEX TABLE テーブル名;
REINDEX INDEX インデックス名;
ロックはしない。トランザクションのタイミングによってロックがかかることがあるらしいけど。
CREATE UNIQUE INDEX インデックス名 ON テーブル名(カラム名);
オンラインで再作成するときは、消す前に同じインデックスを作って、リネームして、古いほうを削除する。
いまのところこれで問題は起きていないですが。
CREATE INDEX インデックス2 ON テーブル名(カラム名);
BEGIN;
ALTER INDEX インデックス1 RENAME TO インデックス3;
ALTER INDEX インデックス2 RENAME TO インデックス1;
DROP INDEX インデックス3;
COMMIT;
CREATE UNIQUE INDEX CONCURRENTLY インデックス2 ON テーブル名 (カラム名);
BEGIN;
ALTER TABLE テーブル名 DROP CONSTRAINT インデックス, ADD CONSTRAINT インデックス UNIQUE USING INDEX インデックス2;
COMMIT;