我有一個腳本可以清除 10 多個經常運行的表。
但是,其中 3 個表有數萬條記錄,這導致腳本需要超過 2 個半小時才能運行。這還不夠好,因為它將在作業日運行以測驗一組正在遷移資料的腳本。
我們嘗試了幾種不同的方法:
DELETE FROM x
需要清空一些外鍵,但這是我們找到的最可靠的方法。但是,就像我已經提到的,運行時對于我們的目的來說太長了。
- 的混合物
DELETE FROM x和TRUNCATE TABLE x
這是我們找到的最快的方法。正常洗掉表,然后截斷有問題的表。但這需要明確的命令來清理表格。這本身就很尷尬,但我們的資料庫模式也經常更改,這使得這很麻煩。
- 禁用約束,然后
TRUNCATE TABLE x
我們還開始撰寫一個腳本來禁用與我們想要清空的表相關的所有 PK/FK 約束,截斷這些表及其子/兄弟/父表,然后重新啟用這些約束。這似乎是一個好方法,但可能過度設計。
我考慮過另一種方法,但我不確定它是否會有所作為。這將洗掉所有 FK 約束ON DELETE CASCADE并向它們添加 a 。這可能會優化方法 1。但我說我會先把它扔給 SO,看看是否有其他人必須處理過這個問題。
uj5u.com熱心網友回復:
截斷比洗掉好,尤其是對于大表。正如您已經發現的那樣,它更快,但它也會重置高水位線,因此您之后運行的查詢會運行得更好。
無論您選擇哪個選項(2 或 3)我都可以,只要您選擇更喜歡的選項。知道順序很重要,所以 - 是的,這有點乏味。
我不會洗掉外鍵約束;它們的存在是有原因的。如果您確實洗掉了它們,請不要忘記之后重新創建它們。
您沒有說該架構中是否涉及其他表。如果沒有,也許您甚至可以洗掉/創建用戶,然后在同一腳本中重新創建表。缺點:“普通”用戶無法做到這一點,您需要擁有 DBA 權限的人。
uj5u.com熱心網友回復:
TRUNCATE 陳述句比 DELETE 陳述句清空表要快得多。
在 Oracle(如 PostgreSQL)中,TRUNCATE 陳述句(如 DELETE 陳述句)上有一個 CASCADE 選項,這可能有助于解決“過度工程”部分(當您想禁用 FK 時,然后重新啟用它們)。
TRUNCATE TABLE x CASCADE;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407676.html
標籤:
上一篇:來自表中不存在的列的位置
