UNIQUE
制約またはPRIMARY KEY
を作成すると、UNIQUE
btreeインデックスが作成されます。このインデックスは、レコードがINSERT
ed、UPDATE
ed、またはDELETE
dの場合はいつでも更新する必要があります。の場合は、インデックスの列が変更されます。インデックス付きの列が変更されていない場合は、特にHOT(ヒープのみのタプル最適化)がインデックスに更新されないようにすることができます。特にページ内にスペースを空けるためにデフォルト以外のFILLFACTOR
がある場合。
挿入/更新時のインデックス更新に時間がかかるため、UNIQUE
インデックス付きテーブルに挿入すると、一意のインデックスまたはプライマリキーを使用しないで挿入するよりも処理が遅くなります。 UPDATE
についても同じことが当てはまりますが、更新するタプルを見つけるためにインデックスを使用すると(通常はseqscanを避ける)、通常はインデックスを持たない場合と比較して純粋な勝ちです。タプルの検索に別のインデックスを使用した場合や、seqscanの方が速い場合(小さいテーブルでも同様)、INSERT
のようにインデックスには効果がなく、その操作で更新するための書き込みコストがかかります。これは、UNIQUE
インデックスだけでなく、すべてのインデックスに当てはまります。
UNIQUE
インデックスカラムの各INSERT
またはUPDATE
には、キーが既存のキーと競合しないことを確認するためにインデックスルックアップが必要です。あいまいな記憶から、これは新しいエントリをインデックスに挿入するプロセスと組み合わされますが、私は100%確信していません。
AFAIK DELETE
インデックスには影響しません。ヒープ内のタプルに対してxmax
を設定するだけです。
ROLLBACK
UNIQUE
制約付き列で正常に挿入または更新された後、トランザクションまたはトランザクションがエラーで中止されても、インデックスが更新されます。 VACUUM
autovacuumによる作業は、後でデッドインデックスエントリを消去します。 Concurrency Control in the PostgreSQL manualを参照してください。
PRIMARY KEY
の場合も同様で、UNIQUE
インデックスを使用して実装されています。
PRIMARY KEY
およびUNIQUE
制約で使用されるインデックスを含むすべてのインデックスは、書き込みパフォーマンスにペナルティが発生します。
お返事ありがとうございます。これは非常によく説明されました。プライマリキーはレコードのソート順にも影響しますか?私の他の質問への回答を提供することができれば嬉しいです:http://stackoverflow.com/questions/13190720/what-is-theorder-of-records-when-the-primary-key-is-指定された列の指定 –