We do that a lot, using all sorts of strategies.
The thing that helps the most is if the REMOTE has a ChangeDateTime column, on every table, so that we only have to "pull" new rows. Need to also handle Deleted Rows, we do that by "pulling" all the PKey values, and deleting anything (locally) that is not in that list, but if you can "log" the deletions on the Remote that is better (particularly for tables with many millions of rows)
We pre-sort the import (on clustered index keys) and use the bulk import hint that the imported data is in clustered index order.
That sounds like you mean 4-part naming e.g.
SELECT Col1, Col2, ...
we very rarely do that, much more often we use OPENQUERY because we find it performs better, but if you are pulling "lots of millions of rows" then some sort of batch-size control is needed (which, for us, is solved by ChangeDateTime column because we never have "lots of millions of rows" that have CHANGED since the last import.