• 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