私は最近、Postgresで手動削除カスケードを実装しました。私はこのテーブルをpg_dependとDFSを使ってオブジェクトから階層を取得しましたが、Postgres自身の実装ほど高速ではありません。だから、Postgresはこれを内部的にどのように実装していますか?Postgresは内部で削除カスケードをどのように実装していますか?
答えて
PostgreSQLの更新/削除カスケードの実装は非常に簡単です。基本的にはfor each row ... on delete ... execute procedure ...
トリガーで、到達するのはdelete from only [othertable] where [foreign_key_col] = OLD.[primary_key_col]
です。ユーザーレベルのトリガーでは利用できないトリックがいくつかありますが、それはその要点です。
詳細はRI_FKey_cascade_del
をsrc/backend/utils/adt/ri_triggers.c
に記載しています。
FK関係の外部(参照)側にインデックスがあり、参照側が参照元の列にインデックスのない大きなテーブルである場合は、本当にひどいです。
PostgreSQL(または少なくとも9.6およびoler)は、削除するキーをバッチアップするのに十分スマートではなく、単一の大きなDELETE FROM
を実行します。保留中の削除キーをタプルストアに蓄積することはできません。直ちに各削除をディスパッチするか、(FK関係が延期されている場合は)トリガーのキューに蓄積して起動しなければなりません。
あなたができるように簡単は、カスケードのパフォーマンスは、あなたが親テーブルから削除される行を削除するバッチにDELETE ... FROM ... USING ...
またはDELETE ... WHERE EXISTS (...)
を使用して削除するビートする必要があります。
9.6?最新バージョンは9.5 – Elad
@Elad 9.6はフィーチャーフリーズを突破し、ベータ版を予定しています。だから9.6はそのような能力も持たないでしょう。 –
@CraigRingerは助けてくれてありがとう、私はすでにそれが本当に良いと簡単なトリックのようなもので考えていた。 –
- 1. 外部キー削除カスケードの制約が動作しないpostgres
- 2. カスケード削除エンティティフレームワーク4.どのようにしますか?
- 3. プロトコルはどのように内部実装されていますか?
- 4. Javaインターフェイスはどのように内部実装されていますか? (vtables?)
- 5. SQL 2008のHierarchyIDデータ型でカスケード削除を実行するにはどうすればよいですか?
- 6. GreenPlumは外部テーブルをどのように実装していますか?
- 7. columにON DELETE CASCADEがない場合、どのようにカスケード削除を実行しますか?
- 8. EF4でカスケード削除を実行するにはどうすればよいですか?
- 9. カスケード削除は意図しないレコードを削除します
- 10. mysqlテーブルのカスケード削除についてどう思いますか?
- 11. 逆の外部キーでDjangoカスケード削除
- 12. Redisonは内部でRedisコマンドを実装していますか?
- 13. ldstrは内部的にnewobjを実装していますか?
- 14. SQLでカスケードを削除しようとしました。
- 15. この削除クエリをpostgresで高速に実行させるにはどうすればよいですか?
- 16. JPAでのカスケード削除@OneToManyとデータベースカスケードの外部キーの削除
- 17. Redux Thunkはどのように実装していますか
- 18. SQLデータベースエンジン内でデータベーストリガはどのように実装されていますか?
- 19. postgresqlでソフト削除を正しく実装する方法は?私はpostgresで
- 20. ドッカーボリュームの内容をどのように削除しますか?
- 21. 名前付きタプルは内部でPythonでどのように実装されていますか?
- 22. Objectクラスはどのように実装されていますか(hashCodeや内部フィールドなどのメソッド)?
- 23. カスケード削除を使用せずに外部キーを持つActive Recordオブジェクトを削除するにはどうすればよいですか?
- 24. 誤ってカスケード削除をfalseにします。今私はそれを真実に戻したいと思う。どうしたらいいですか?
- 25. EFコードファーストでリンクテーブルのカスケード削除を無効にするにはどうすればよいですか?
- 26. nodejs REST実装のazureデータストア内のエンティティを削除する削除要求のシグネチャを作成するにはどうすればよいですか?
- 27. Postgresでトリガを削除しました - まだどこかで実行しようとしています。ポストグルログに失敗したとして表示する
- 28. 流暢なAPIを使ってベーステーブルのカスケード削除をどのように指定しますか?
- 29. SQLAlchemyの削除はカスケードしません
- 30. Spring.netでどのように内部的に依存性注入が実装されていますか?
ソースコードを確認してください:http://www.postgresql.org/ftp/source/ –