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

SQLServerピボットと複数結合

    答えはもちろん「状況によって異なります」ですが、この目的のテストに基づいています...

    仮定

    1. 100万個の製品
    2. product product_idにクラスター化されたインデックスがあります
    3. ほとんどの(すべてではないにしても)製品のproduct_codeに対応する情報があります テーブル
    4. product_codeに存在する理想的なインデックス 両方のクエリに対して。

    PIVOT バージョンには、理想的にはインデックスが必要ですproduct_code(product_id, type) INCLUDE (code) 一方、JOIN バージョンには、理想的にはインデックスが必要ですproduct_code(type,product_id) INCLUDE (code)

    これらが実施されている場合は、以下の計画を示します

    次に、JOIN バージョンはより効率的です。

    type 1の場合 およびtype 2 typesは テーブル内でPIVOT バージョンは、product_codeを検索する必要がないため、読み取り数の点でわずかに優位性があります。 2回ですが、ストリーム集約演算子の追加のオーバーヘッドがそれを上回っています

    PIVOT

    Table 'product_code'. Scan count 1, logical reads 10467
    Table 'product'. Scan count 1, logical reads 4750
       CPU time = 3297 ms,  elapsed time = 3260 ms.
    

    参加

    Table 'product_code'. Scan count 2, logical reads 10471
    Table 'product'. Scan count 1, logical reads 4750
       CPU time = 1906 ms,  elapsed time = 1866 ms.
    

    追加のtypeがある場合 1以外のレコード および2 JOIN バージョンは、type,product_idの関連するセクションで結合をマージするだけなので、その利点が増えます。 PIVOTに対してインデックス プランはproduct_id, typeを使用します そのため、追加のtypeをスキャンする必要があります 1と混在している行 および2 行。



    1. 外部サービスでログインする

    2. InnoDBに1つまたは複数のテーブルの外部キーを再チェックするように強制しますか?

    3. MySQLのプロセスリストの表示に完全なSQLクエリを表示する

    4. ライブマテリアライズドビューでMySQLとPostgresに参加する方法