In terms of the delete (and depending on indexes), instead of using "IN" in your where clause, I'd use something like:
DECLARE @Id INT
SELECT @Id = MAX(Id) FROM (SELECT TOP 3000 ID FROM MyTable ORDER BY Id)
DELETE a
FROM
MyTable a
INNER JOIN MyTable b ON b.ID = a.ID AND b.ID < @Id