Something very interesting happened the other day when I decided to use the Move-Mailbox cmdlet in Exchange 2007 to move about 350 mailboxes from one storage group to another. I ran the following command first:
Get-Mailbox -Database mailsrvr\SG07\SG07-DB01 -ResultSize unlimited Move-Mailbox -TargetDatabase mailsrvr\SG01\SG01-DB01 -MaxThreads 15 -PreserveMailboxSizeLimit -ReportFile C:\MoveResultAll.txt
It just took forever to move mailboxes. Note that I used 15 threads to move mailboxes thinking that it would move 15 mailboxes at once. The size of mailboxes on average was 150-200 MB. I was expecting this to finish within 3-4 hours. I finally decided to cancel the task and started to investigate as to why it took this long for these to move. I finally came to the conclusion that it was because some the large mailboxes took forever to move and caused bottle neck for other many smaller mailboxes. But I was kind of surprised because my own mailbox is nearly 800 MB and it took 10 minutes to move. I mean we have a pretty heavy duty Exchange server. So next day I tried the following script to larger mailboxes will be moved first and then all smaller ones.
Get-MailboxStatistics -Database mailsrvr\SG08\SG08-DB01 Sort-Object TotalItemSize Move-Mailbox -TargetDatabase mailsrvr\SG10\SG10-DB01 -MaxThreads 30 -PreserveMailboxSizeLimit -ReportFile C:\MoveResult_All.txt
It still took forever and after 2 hours it had moved only 15 mailboxes. Note that this time I even used 30 threads to move mailboxes.
I finally decided to move mailboxes using Move mailbox wizard. You an use up to five mailboxes at a time with default of 5 threads and with 10 wizard windows open.
This turned out to be very fast as I was move 50 mailboxes on an average of 30 minutes.
I am surprised that there was too much delay when using PowerShell to move mailboxes on the same server on Exchange 2007. I used same commands to move mailboxes from Exchange 2000 to Exchange 2007 during the migration. However, there I was using multiple shell window to run Move-Mailbox cmdlet using different OUs.