0

pg_stat_user_indexes テーブルでわかるように、外部キー インデックスは使用されません。それらを削除したい。未使用のために外部キー インデックスを削除するデメリットはありますか。

db=# SELECT * FROM pg_stat_user_indexes WHERE relname='order_cancellationreason';
     relid | indexrelid | schemaname |         relname          |                indexrelname                 | idx_scan | idx_tup_read | idx_tup_fetch 
    -------+------------+------------+--------------------------+---------------------------------------------+----------+--------------+---------------
     29835 |      31055 | public     | order_cancellationreason | order_cancellationreason_address_id         |        0 |            0 |             0
     29835 |      31053 | public     | order_cancellationreason | order_cancellationreason_cancelled_by_id    |        0 |            0 |             0



 db=#\d+ order_cancellationreason
     ...
     Indexes:
        "order_cancellationreason_cancelled_by_id" btree (cancelled_by_id)
        "order_cancellationreason_address_id" btree (address_id)

    Foreign-key constraints:
        "cargo_id_refs_id_f4ffe34d" FOREIGN KEY (cargo_id) REFERENCES cargo_cargoinfo(id) DEFERRABLE INITIALLY DEFERRED
        "order_cancellationreason_address_id_fkey" FOREIGN KEY (address_id) REFERENCES invoice_address(id) DEFERRABLE INITIALLY DEFERRED
        "order_cancellationreason_cancelled_by_id_fkey" FOREIGN KEY (cancelled_by_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
4

1 に答える 1

2

参照整合性を強制するために、参照元の外部キー列のインデックスは必要ありません。そのためには、参照先の列に一意のインデックスのみが必要です。

参照列のインデックスを削除することの唯一の欠点は、チェックと適用が非常に遅くなる可能性があることです。FK ターゲット テーブルから行を削除しようとすると、データベースはその値が参照列に表示されるかどうかを確認し、削除を拒否するか、ON DELETE CASCADEキーの場合は削除する必要があります。いずれにせよ、参照列にインデックスがないと、seqscan が発生する可能性があります。小さな参照テーブルの場合は問題ありませんが、大きな参照テーブルの場合、特に複数の FK チェックが行われている場合、パフォーマンスは本当にひどいものになる可能性があります。

アプリケーションが FK チェックを実際に使用したことがない場合、つまり、FK チェックが実際にチェックされて強制されることを期待するのではなく、データ モデルを宣言し、安心するために存在する場合は、参照列インデックスを削除することをお勧めします。大丈夫。

アプリが実際に参照先のテーブルで削除または更新を実行する場合は、インデックスを保持することをお勧めします。

FK 強制チェックが に正しく表示されることを確認していませんpg_stat_user_indexes。自分で確認することをお勧めします。参照先テーブルで失敗することがわかっているいくつかの削除を実行してみて、参照列のインデックス統計が変化するかどうかを確認してください。

于 2013-02-22T02:47:40.417 に答える