1) Whenever a checkpoint occurs. Only log records up to the beginning of the oldest open transaction can be truncated.
2) Do it in batches and run CHECKPOINT between those batches.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability