Postgresql
PostgreSQL 中的 DELETE 非常慢,解決方法?
我在 PostgreSQL 9.2 上有一個數據庫,它有一個包含大約 70 個表的主模式和可變數量的相同結構的每個客戶端模式,每個模式有 30 個表。客戶端模式具有引用主模式的外鍵,而不是相反。
我剛開始用從以前版本中獲取的一些真實數據填充數據庫。當我不得不在主模式的一個非常中心的表中進行批量刪除時,數據庫已經達到了大約 1.5 GB(預計在幾週內會增長到幾十 GB)。所有相關的外鍵都標記為 ON DELETE CASCADE。
這將花費很長時間並不奇怪,但在 12 小時後,很明顯我最好重新開始,刪除數據庫並再次啟動遷移。但是,如果我需要稍後在數據庫處於活動狀態且更大時重複此操作怎麼辦?是否有其他更快的方法?
如果我編寫一個腳本來瀏覽從屬表,從離中心表最遠的表開始,逐表刪除相關行,會不會快得多?
一個重要的細節是某些表上有觸發器。
我有一個類似的問題。事實證明,這些
ON DELETE CASCADE
觸發器大大減慢了速度,因為這些級聯刪除非常慢。我通過在引用表上的外鍵欄位上創建索引解決了這個問題,我從花了幾個小時刪除到幾秒鐘。
你有幾個選擇。最好的選擇是執行批量刪除,以免觸發觸發器。在刪除之前禁用觸發器,然後重新啟用它們。這可以為您節省大量時間。例如:
ALTER TABLE tablename DISABLE TRIGGER ALL; DELETE ...; ALTER TABLE tablename ENABLE TRIGGER ALL;
這裡的一個主要關鍵是您希望最小化子查詢的深度。在這種情況下,您可能需要設置臨時表來儲存相關資訊,這樣您就可以避免在刪除時出現深度子查詢。