2017-09-01 63 views
0

我想知道最好的做法是什麼,當你有一個大的ID列表,並且你需要刪除列表中不包含ID的行。刪除id不在(非常大)列表中的行 - 最佳實踐?

在我看來,喜歡去使用「不」特性的方式:

DELETE FROM Foo 
WHERE ID NOT IN (1, 2, 3,... 20000) 

但我不知道該如何解決性能兼容,當您的名單是相當大的。

有關如何做到這一點的任何建議嗎?

+1

填寫一個臨時表 –

+0

..和使用不存在? – Amit

+0

可以詳細說明嗎? – mp1990

回答

3

您可以創建並填寫一個臨時表,然後用NOT INNOT EXISTSLEFT OUTER JOIN

CREATE TABLE #foo(id INT) 

INSERT #foo VALUES(1) 
INSERT #foo VALUES(2) 
INSERT #foo VALUES(3) 
INSERT #foo VALUES(4) 
INSERT #foo VALUES(5) 
INSERT #foo VALUES(6) 
INSERT #foo VALUES(20000) 

WHILE @@rowcount > 0 
BEGIN 
    DELETE TOP (100) FROM Foo WHERE NOT EXISTS (SELECT 1 FROM #foo f WHERE f.Id = Foo.ID) 
END 

相關:How would I create a temp table in SQL Server when I have a big list of ID's

+0

爲什麼while循環? – Amit

+0

@Amit:不需要,只是如果表格太大,批量刪除的方法 –

+1

確保臨時表中存在索引或甚至更好的主鍵。 –