2016-04-13 1 views
0

私は最近、Postgresで手動削除カスケードを実装しました。私はこのテーブルをpg_dependとDFSを使ってオブジェクトから階層を取得しましたが、Postgres自身の実装ほど高速ではありません。だから、Postgresはこれを内部的にどのように実装していますか?Postgresは内部で削除カスケードをどのように実装していますか?

+0

ソースコードを確認してください:http://www.postgresql.org/ftp/source/ –

答えて

1

PostgreSQLの更新/削除カスケードの実装は非常に簡単です。基本的にはfor each row ... on delete ... execute procedure ...トリガーで、到達するのはdelete from only [othertable] where [foreign_key_col] = OLD.[primary_key_col]です。ユーザーレベルのトリガーでは利用できないトリックがいくつかありますが、それはその要点です。

詳細はRI_FKey_cascade_delsrc/backend/utils/adt/ri_triggers.cに記載しています。

FK関係の外部(参照)側にインデックスがあり、参照側が参照元の列にインデックスのない大きなテーブルである場合は、本当にひどいです。

PostgreSQL(または少なくとも9.6およびoler)は、削除するキーをバッチアップするのに十分スマートではなく、単一の大きなDELETE FROMを実行します。保留中の削除キーをタプルストアに蓄積することはできません。直ちに各削除をディスパッチするか、(FK関係が延期されている場合は)トリガーのキューに蓄積して起動しなければなりません。

あなたができるように簡単は、カスケードのパフォーマンスは、あなたが親テーブルから削除される行を削除するバッチにDELETE ... FROM ... USING ...またはDELETE ... WHERE EXISTS (...)を使用して削除するビートする必要があります。

+0

9.6?最新バージョンは9.5 – Elad

+0

@Elad 9.6はフィーチャーフリーズを突破し、ベータ版を予定しています。だから9.6はそのような能力も持たないでしょう。 –

+0

@CraigRingerは助けてくれてありがとう、私はすでにそれが本当に良いと簡単なトリックのようなもので考えていた。 –

関連する問題