簡體   English   中英

如何以最高效的方式從表中刪除大量記錄?

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

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