インデックス - RDB(PostgreSQL)

最終更新日: 2026-08-25

TOP(About this memo)) > 一覧(RDB) > インデックス(PostgreSQL)

インデックス(PostgreSQL)

Seq ScanとIndex Scan

データ件数が少なく、Seq Scanの方が効率的と判断された場合は、Index Scanが可能であってもオプティマイザによりSeq Scanが選択される。

以下のようにoffにすることで、Index Scanを優先させることが可能(ただしSeq Scanしか使えない場合はSeq Scanになる)。

SET enable_seqscan TO 'off'
select name, setting, unit from pg_settings where name = 'enable_seqscan'

戻す場合:

SET enable_seqscan TO 'on'

インデックスの作成例

CREATE INDEX index__user_datas__user_id ON "user_datas" (user_id);

削除:

DROP INDEX index__user_datas__user_id;

複合インデックス

単一のカラムだけしか使わない場合、そこまで速度の違いはなさそう(?)。

JOIN

主キー(PRIMARY)・一意キー(UNIQUE)とユニークインデックス

一意キー(UNIQUE)の作成

下記を実行すると、ユニーク制約とともに user_status_user_id_key という名前でユニークインデックスのオブジェクトが作成される。

CREATE TABLE "user_status" (
    "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
    "user_id" uuid NOT NULL UNIQUE
);

下記でも同じ結果となる。

CREATE TABLE "user_status" (
    "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
    "user_id" uuid NOT NULL
);
ALTER TABLE "user_status" ADD CONSTRAINT "user_status_user_id_key" UNIQUE("user_id");

一意キー(UNIQUE)の削除

ユニークインデックスを直接削除しようとするとエラーとなる。

DROP INDEX user_status_user_id_key;
/*
DROP INDEX user_status_user_id_key; (details: ERROR: cannot drop index user_status_user_id_key because constraint user_status_user_id_key on table user_statuses requires it (SQLSTATE 2BP01))
*/

下記のように制約を削除することで、制約とユニークインデックスの両方が削除される。

ALTER TABLE "user_statuses" DROP CONSTRAINT "user_status_user_id_key";

主キー