我有大約500萬行,其具有FK約束引用另一個表(也約爲500萬行)的主鍵的表。的PostgreSQL - 禁用約束
我需要從兩個表中刪除大約75000行。我知道,如果我嘗試在啓用fk約束的情況下執行此操作,它將花費不可接受的時間。
從Oracle後臺我首先想到的是禁用約束的到來,做刪除&然後重新啓用約束。 PostGres似乎讓我禁用約束觸發器,如果我是超級用戶(我不是,但我作爲擁有/創建對象的用戶登錄),但似乎不是我想要的。
另一種選擇是刪除約束,然後恢復它。我擔心重建約束將會因爲我的表的大小而需要很長時間。
有什麼想法?
編輯:比利的鼓勵後,我試圖在不改變任何限制做了刪除,它需要超過10分鐘。但是,我發現我試圖刪除的表有一個自引用外鍵...重複(&未索引)。
最後更新 - 我放棄了自我參照外鍵,沒有我的刪除和添加它放回比利對周圍但不幸的是我不能接受的答案他的評論!
如果它採取的是長,即使有500萬行,那麼你有什麼錯誤的設置。 – 2010-04-21 02:07:02
什麼?刪除或重新啓用約束?是的,這很有可能是錯誤地或以不優化的方式設置的 - 數據庫幾乎已經被hibernate「構建」了(我沒有任何關係)。 – azp74 2010-04-21 02:10:07
刪除。從索引表檢查FK需要線性時間,並刪除75000 + 75000行= 150 000行。考慮每個FK檢查(二進制搜索,lg(500萬)= 19)的最差情況19次比較,以及每行比較可能20次機器比較,等於57 000 000次比較。考慮到平均機器每秒可以做十億次比較的保守估計,很容易,這仍然需要不到一秒鐘的CPU時間。從磁盤加載也不應該是一個主要問題,因爲即使在500萬行中,表格也應該放在RAM中。 – 2010-04-21 02:15:43