最終更新日: 2026-08-25
TOP(About this memo)) > 一覧(RDB) > インデックス(PostgreSQL)
データ件数が少なく、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;
単一のカラムだけしか使わない場合、そこまで速度の違いはなさそう(?)。
is_unique が true となっているところ(?)。CREATE UNIQUE INDEX〜)のではなく、主キーや一意キーを作る(ALTER TABLE〜)のがよさそう(IMO)。下記を実行すると、ユニーク制約とともに 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");
ユニークインデックスを直接削除しようとするとエラーとなる。
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";