sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2005 での UNION ALL のパフォーマンス

    各テスト実行の間に、実行キャッシュとデータ キャッシュを必ずクリアしてください。

    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 も、結合と同じような方法で作り直してください。



    1. 更新Sqlで列名を変更するApacheDbutils

    2. phpデータベースの画像は問題を示しています

    3. SQL Serverで時間を比較するにはどうすればよいですか?

    4. NetBeans 9.0、パート4のJava9でJShellを使用する