What is the best way to remove large amount of data from large tables?
I've faced such problems a few times so I have 2 tips for you.

1 Use this script that breaks your delete in packages so you will not run the risk of crashing the log

declare @var int, @ var2 int
set @var = (select count (1) from &lt;Table_to_Delete&gt; WHERE &lt;Your-delete-clause&gt;)
set @ var2 = 0

while @ var2 &lt;&gt; @var
begin
set rowcount 50000 - batchsize

print getdate ()
delete from &lt;Table_to_Delete&gt; WHERE &lt;Your-delete-clause&gt;

set @ var2 = @ var2 + @@ ROWCOUNT
print getdate ()

checkpoint - it's optional to avoid log grow

end


2) Now if the amount of rows that should remain in the table is really small, example if you are to delete 80 ~ 90% of the table I recommend you copy the table structure and copy the data to the new table. This option is valid if the table structure is simple because you will have to remember to copy all indices, foreing keys, and explicit permissions.