簡體   English   中英

Postgres如何在內部實現刪除級聯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM