[英]How does Postgres implement a delete cascade internally?
我最近在Postgres中實現了手動刪除級聯。 我在此表上使用了pg_depend和DFS來從對象中獲取層次結構,但是它不如Postgres自己的實現快。 那么Postgres如何在內部實現呢?
PostgreSQL的更新/刪除級聯的實現非常簡單。 基本上for each row ... on delete ... execute procedure ...
都是一個for each row ... on delete ... execute procedure ...
觸發器, delete from only [othertable] where [foreign_key_col] = OLD.[primary_key_col]
進行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 (...)
批量刪除行,然后將其從中刪除,您應該能夠輕松勝過級聯刪除的性能。父表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.