In general, when I have a lot of rows to delete, I do it in a loop with a "wait". The advantages for me are:
Small chunks so I can see it progress.
Does not hog the system completely
Can be stopped & restarted without starting over
It may not be the fastest method, but in my case I needed to run it on a production server with minimal impact on others. Experiment with delay time & delete size
basically i set it up like this:
DeleteMore:
waitfor delay 5 seconds (to give others some cpu)
delete top 10000 from tableA where ......
if @@rowcount > 0 goto DeleteMore