Gail Shaw explains how operators like sort can reduce the actual row count:
A non-blocking operator is one that consumes and produces rows at the same time. Nested loop joins are non-blocking operators.
A blocking operator is one that requires that all rows from the input have been consumed before a single row can be produced. Sorts are blocking operators.
Some operators can be somewhere between the two, requiring a group of rows to be consumed before an output row can be produced. Stream aggregates are an example here.
Gail ends by explaining that this is why “Which way do you read an execution plan, right-to-left or left-to-right?” has a correct answer: both ways. This understanding of blocking, non-blocking, and partially-blocking operators will also help you optimize Integration Services data flows by making you think in terms of streams.