-
インデックスは通常、すべての行の90%での操作には役に立ちません。シーケンシャルスキャンはどちらの方法でも高速になります。 (エキゾチックな例外が適用されます。)
-
同時読み取りを許可する必要がある場合、テーブルを排他的にロックすることはできません。したがって、同じトランザクションでインデックスを削除することもできません。
-
あなたはできた 排他ロックの期間を最小限に抑えるために、個別のトランザクションでインデックスを削除します。 Postgres 9.2以降では、 DROP INDEXCONCURRENTLY を使用することもできます。 、最小限のロックのみが必要です。後で
CREATE INDEX CONCURRENTLY
を使用します バックグラウンドでインデックスを再構築し、非常に短い排他ロックのみを取得します。
残っている行の10%(またはそれ以下)を特定するための安定した条件がある場合は、部分インデックス 両方に最適な行だけを表示します:
- クエリを読み取ると、いつでも(部分インデックスを使用して)テーブルにすばやくアクセスできます。
- 大きな
DELETE
DELETE
にはどの行も含まれていないため、部分インデックスはまったく変更されません。 。
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
delete_flag
を想定 boolean
です 。 Postgresが部分インデックスを作成できるようにするには、(論理的に冗長に見える場合でも)クエリに同じ述語を含める必要があります。