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

JOINとWHERE:同じ結果を取得する2つのクエリが、3〜4桁のパフォーマンスの違いを示すのはなぜですか?

    MySQLには既知の問題 があります 相関サブクエリまたはサブ選択を含むクエリを最適化します。バージョン5.6.5までは、サブクエリはマテリアライズされませんが、結合で使用される派生テーブルはマテリアライズされます。

    本質的に、これは、結合を使用するときに、サブクエリが最初に検出されたときに、MySQLが次のことを実行することを意味します。

    SELECT code1 FROM myTable GROUP BY code1 HAVING COUNT(code1) > 1
    

    そして、結果を一時テーブル(ルックアップを高速化するためにハッシュ化されます)に保持してから、myTableの値ごとに保持します 一時テーブルを検索して、コードが存在するかどうかを確認します。

    ただし、INを使用する場合は サブクエリは具体化されず、次のように書き直されます:

    SELECT t1.code1, t1.code2
    FROM myTable t1
    WHERE EXISTS
        (   SELECT t2.code1 
            FROM myTable t2
            WHERE t2.Code1 = t1.Code1
            GROUP BY t2.code1 
            HAVING COUNT(t2.code1) > 1
        )
    

    つまり、codeごとに myTableで 、サブクエリを再度実行します。サブクエリを数回だけ実行する方が、すべての値に対して実行して結果を一時テーブルに保存するよりも効率的であるため、外部クエリが非常に狭い場合は問題ありませんが、外部クエリが広い場合は、結果が得られます。何度も実行される内部クエリで、ここでパフォーマンスの違いが発生します。

    したがって、行数については、サブクエリを最大30,000回実行する代わりに、1回実行してから、400行しかないハッシュ化された一時テーブルに対して最大30,000行を検索します。これにより、パフォーマンスが大幅に低下します。

    オンラインドキュメントのこの記事 サブクエリの最適化についてさらに詳しく説明します。




    1. 合成データの生成

    2. DMV(動的管理ビュー)とDMF(動的管理機能)の使用| SQLServerのパフォーマンスのトラブルシューティング-4

    3. 2 Oracleの日付から日、月、年を取得する関数

    4. カラム側の暗黙的な変換はどれくらいの費用がかかりますか?