A common issue with large DML operations, like deletes, is the impact on system resources especially tempdb. Even in simple mode large delete operations can have a significant impact on your database & tempdb resources.
I often use the following code to batch my delete operations utilizing the t-sql windowing function capabilities (You could always use GROUP BY and HAVING cnt > 1):
SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;
WHILE @r > 0
DELETE TOP (5000) del FROM
(select *, rn=row_number() over (partition by [Office],preparer order by [Office],Preparer)
FROM [Database].[Schema].[YourTable]) del
where rn > 1;
SET @r = @@ROWCOUNT;
CHECKPOINT; — if simple
— BACKUP LOG … — if full
This code is relatively efficient, fast and works well.