各テスト実行の間に、実行キャッシュとデータ キャッシュを必ずクリアしてください。
例
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
最初に UNION ALL で実行し、その後 2 つの select を個別に実行すると、データは既にメモリにキャッシュされているため、パフォーマンスが大幅に向上します (したがって、そうでない場合でも、後続のアプローチの方が速いという誤った印象を与えます)。 /P>
UNION を使用した場合、DISTINCT を適用する必要があるため遅くなる可能性がありますが、UNION ALL はそれを行う必要がないため、違いはありません。
更新:
実行計画を見て比較し、違いがあるかどうかを確認します。クエリを実行する前に、SSMS で [実際の実行計画を含める] ボタンをクリックすると、実行計画を表示できます
アップデート 2:
与えられた完全な CTE に基づいて、私はそれらの最適化を検討していると思います - UNION ALL が実際に問題であるとは思いません.
私見ですが、CTE を 1 つずつ調べて、それぞれを個別に最適化して、メイン クエリですべてを組み合わせると、パフォーマンスが向上するようにすることをお勧めします。
例えばtDictionaryStreets の場合、これを試してみてはいかがでしょうか:
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 には、少なくともインデックスが必要です。tDictionarySubCities も、結合と同じような方法で作り直してください。