[英]How to delete heavy records from a table in the most performant way?
情況是這樣的:我有一個包含16,000行的表,一個帶有4,000,000行的子表。 父表的列包含大量數據(這是用於幾何圖形的wkt)。 我需要定期清理數據,這時我需要刪除5685個父行以及1,400,000個子行。 我正在努力編寫性能最高的查詢來實現這一目標。 我當前的方法是這樣的:
1)從需要刪除的行中獲取父表中的所有ID。
從ParentTable中選擇SELECT,ValidTo,其中ValidTo <someDate;
2)對於每個ID,我發現我正在執行以下命令:
從ChildTable刪除,其中ParentId = IdFromStepOne;
從ParentTable刪除Id = IdFromStepOne
95-100條記錄需要15分鍾,因此它將在14小時內完成。 我正在.Net Core中進行編碼,並使用Entitiy Framework為您提供信息。
提前致謝!
您的查詢顯示您正在遍歷每個ID並刪除子級和父級行。
使用IN子句對多個值執行它。
DELETE FROM ChildTable WHERE ParentId in (SELECT Id From ParentTable Where ValidTo < someDate)
DELETE FROM ParentTable WHERE Id in (SELECT Id From ParentTable Where ValidTo < someDate)
由於您需要刪除兩個表中的行,因此將需要2個查詢,而SELECT
查詢不需要選擇ValidTo
列,而僅選擇ID。
我會寫這些查詢:
DELETE FROM ChildTable ct
WHERE EXISTS (SELECT pt.Id FROM ParentTable pt WHERE ct.Id_parent = pt.Id AND pt.ValidTo < someDate);
DELETE FROM ParentTable
WHERE ValidTo < someDate;
使用pl / sql,您應該能夠選擇ParentTable的Id
以便僅刪除一次。
Query1 => SELECT Id FROM ParentTable WHERE ValidTo < someDate
Query2 => DElETE FROM ChildTable WHERE id_parent IN [results of Query 1]
Query3 => DELETE FROM ParentTable WHERE Id IN [results of Query 1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.