sql >> データベース >  >> RDS >> PostgreSQL

頻繁にアクセスされるテーブルから多くの行を削除する方法

    1. インデックスは通常、すべての行の90%での操作には役に立ちません。シーケンシャルスキャンはどちらの方法でも高速になります。 (エキゾチックな例外が適用されます。)

    2. 同時読み取りを許可する必要がある場合、テーブルを排他的にロックすることはできません。したがって、同じトランザクションでインデックスを削除することもできません。

    3. あなたはできた 排他ロックの期間を最小限に抑えるために、個別のトランザクションでインデックスを削除します。 Postgres 9.2以降では、 DROP INDEXCONCURRENTLY を使用することもできます。 、最小限のロックのみが必要です。後でCREATE INDEX CONCURRENTLYを使用します バックグラウンドでインデックスを再構築し、非常に短い排他ロックのみを取得します。

    残っている行の10%(またはそれ以下)を特定するための安定した条件がある場合は、部分インデックス 両方に最適な行だけを表示します:

    • クエリを読み取ると、いつでも(部分インデックスを使用して)テーブルにすばやくアクセスできます。
    • 大きなDELETE DELETEにはどの行も含まれていないため、部分インデックスはまったく変更されません。 。
    CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
    

    delete_flagを想定 booleanです 。 Postgresが部分インデックスを作成できるようにするには、(論理的に冗長に見える場合でも)クエリに同じ述語を含める必要があります。



    1. geodjangoのk最近傍を取得するにはどうすればよいですか?

    2. PostgreSQLarray_aggの順序

    3. パブリックシノニムを正しく作成する方法

    4. インメモリデータベースを使用したユニットテスト