UNION ALL returns all rows, with no additional processing. A simple UNION sorts the entire row set to eliminate duplicates. While the optimizer may be able to figure everything out by studying the indices and constraints, you can always give it a little hand like this:
select * from table1
union all
select * from table2
union all
select *
from (
SELECT DISTINCT * from table3
) T
This ensures that the sort-and-eliminate-duplicates is only performed on table3.
Anytime intent can be simply and clearly communicated better to both human users and compilers, that is almost certainly the correct way to write the code. In this case performance may also be enhanced, and cannot be degraded.