To expand a bit on Dan's and J.D.'s comments:
Note that SQL Server doesn't have a distributed optimizer.
In my early database days, some 3 decades ago, I came in contact with IBM's Distributed Relational Database Architecture, DRDA. This included, as I recall, a protocol for optimizers where they could share info and use a holistic view on the query execution.
Imagine you join two tables, one local (A) and one remote (B). You have a predicate on A making it return only three rows. The ideal here would be to ship the three rows from A to B, let B do the query to combine the data, and ship back the result to A.
SQL Server won't do this, since it doesn't have a distributed optimizer. SQL Server B isn't "aware" of SQL Server A. To B, server A is just a client app. Sure, B can expose meta-data about its tables and indexes and stuff to server A (to what extent depends on the capacity of the OLEDB provider used to talk to the remote DBMS), but that is not the same as a distributed optimizer.
So, what can SQL Server do?
For above example, A can retrieve the three rows that satisfies the predicate, and do three remote queries. One for each row.
Also, note that a join doesn't necessarily mean that there has to be some temp data stored anywhere. Only one of the three join types does that (hash joins, the other join types being loop and merge).
Below is an example:
I have linked server named TK\B. I use Adventureworks, and have the same database on both A and B. There's an index on the local table for the WHERE clause, so only three rows satisfy that condition.
When the query uses a linked server, you see the same query being executed three times on the remote server.
Then I instead join to the same table but as a local table, you instead of those three query execution see one clustered index seek.
SELECT AVG(h.SalesPersonID), AVG(UnitPriceDiscount)
FROM [TK\B].Adventureworks.Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d ON d.SalesOrderID = h.SalesOrderID
WHERE d.OrderQty = 34
SELECT AVG(h.SalesPersonID), AVG(UnitPriceDiscount)
FROM Adventureworks.Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d ON d.SalesOrderID = h.SalesOrderID
WHERE d.OrderQty = 34
Here's the plan.