Can someone tell me why these execution plans are so much different?
When I look at the plans, there are zero differences between the two sets of runs where the SQL Statements are the same. However, I see that in FAST there are calls to temporary tables (#TempData, for example), while in SLOW there are calls to table variables (@TMPPLTDATA). Table variables have some performance issues compared to temp tables, specifically that the optimizer always assumes that they will return only one row.
However, the bigger thing I learned, is that these batches aren't doing anywhere near the same thing. There's quite a bit of difference between the two.
So it's simply a matter of different batches doing different work.