Pastikan Anda menghapus cache eksekusi + data di antara setiap uji coba.
misalnya
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Jika Anda menjalankan dengan UNION ALL terlebih dahulu, dan kemudian menjalankan 2 pilihan secara terpisah setelahnya, data sudah akan di-cache di memori sehingga membuat kinerja jauh lebih baik (oleh karena itu memberikan kesan yang salah bahwa pendekatan selanjutnya lebih cepat padahal mungkin tidak).
Jika Anda menggunakan UNION maka itu mungkin lebih lambat karena harus menerapkan DISTINCT, tetapi UNION ALL tidak harus melakukan itu sehingga seharusnya tidak berbeda.
Pembaruan:
Lihatlah rencana eksekusi dan bandingkan - lihat apakah ada perbedaan. Anda dapat melihat rencana eksekusi dengan mengklik tombol "Sertakan Rencana Eksekusi Aktual" di SSMS sebelum menjalankan kueri
Pembaruan 2:
Berdasarkan CTE lengkap yang diberikan, saya pikir saya akan mencari cara untuk mengoptimalkannya - menurut saya UNION ALL bukanlah masalahnya.
IMHO, hal terbaik untuk dicoba adalah bekerja melalui CTE satu per satu dan mencoba mengoptimalkan masing-masing secara individual sehingga ketika Anda menggabungkan semuanya dalam kueri utama, kinerjanya lebih baik.
misalnya untuk tDictionaryStreets, bagaimana kalau mencoba ini:
SELECT DISTINCT
r.KladrItemName AS RegionName,
a.KladrItemName AS AreaName,
c.KladrItemName AS CityName,
sc.KladrItemName AS SubCityName,
s.StreetName
FROM StreetNames s
JOIN tFoundStreets fs ON s.StreetName = fs.KladrItemName
LEFT JOIN tFoundRegions r ON s.RegionName = r.KladrItemName
LEFT JOIN tFoundAreas a ON s.AreaName = a.KladrItemName
LEFT JOIN tFoundCities c ON s.CityName = c.KladrItemName
LEFT JOIN tFoundSubCities sc ON s.SubCityName = scc.KladrItemName
KladrItemName di setiap tabel setidaknya harus memiliki indeks aktif.Coba kerjakan ulang tDictionarySubCities dengan cara yang sama dengan join juga.