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

FORCEPLANを使用してT-SQL結合のクエリオプティマイザをオーバーライドする

    SET FORCEPLAN ステートメントは、SQLServerクエリオプティマイザーがT-SQLSELECTを処理するために使用するロジックをオーバーライドします。 ステートメント。

    具体的には、FORCEPLAN ONに設定されています 、クエリオプティマイザは、テーブルがFROMに表示されるのと同じ順序で結合を処理します クエリの句。

    これにより、クエリの計画を作成するために他のタイプの結合が必要な場合、または結合ヒントまたはクエリヒントで要求されない限り、ネストされたループ結合の使用も強制されます。

    FORCEPLANの方法を示すため 動作します。2つのSELECTを実行します 最初にFORCEPLANを使用したクエリ ONに設定 、次にFORCEPLAN OFFに設定 。

    結合テーブルが異なる順序でリストされていることを除いて、両方のクエリは同一です。

    この例では、SHOWPLAN_XMLを使用します 推定クエリプランを表示しますが、別の方法(Azure Data Studioの[説明]ボタン、またはInclude Actual Execution Planなど)を簡単に使用することもできます。 SSMSのアイコンを使用して、実際のクエリプランを表示します)。

    FORCEPLANをオンに設定

    SET FORCEPLAN ON;
    GO
    
    SET SHOWPLAN_XML ON;
    GO
    
    SELECT
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM 
        Artists ar 
        INNER JOIN Albums al 
        ON ar.ArtistId = al.ArtistId 
        INNER JOIN Genres g 
        ON al.GenreId = g.GenreId;
    
    SELECT
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM 
        Albums al
        INNER JOIN Genres g 
        ON al.GenreId = g.GenreId
        INNER JOIN Artists ar 
        ON ar.ArtistId = al.ArtistId;

    結果:

    各クエリのクエリプランは、FROMにテーブル名を含めた順序を反映していることがわかります。 条項。

    FORCEPLANをオフに設定

    SET SHOWPLAN_XML OFF;
    GO
    
    SET FORCEPLAN OFF;
    GO
    
    SET SHOWPLAN_XML ON;
    GO
    
    SELECT
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM 
        Artists ar 
        INNER JOIN Albums al 
        ON ar.ArtistId = al.ArtistId 
        INNER JOIN Genres g 
        ON al.GenreId = g.GenreId;
    
    SELECT
        ar.ArtistName,
        al.AlbumName,
        g.Genre
    FROM 
        Albums al
        INNER JOIN Genres g 
        ON al.GenreId = g.GenreId
        INNER JOIN Artists ar 
        ON ar.ArtistId = al.ArtistId;

    結果:

    今回は、両方のクエリで同じクエリプランが作成されます。クエリオプティマイザは、FROMにリストした順序を無視しました 条項と独自の順序を決定しました。

    FORCEPLANに注意してください 設定は、SELECTによって返されるデータを変更しません 声明。 FORCEPLANかどうかに関係なく、実際の結果は同じです。 ONに設定されています またはOFF 。唯一の違いは、テーブルの処理方法です(パフォーマンスに影響を与える可能性があります)。

    SET FORCEPLANを使用できます クエリオプティマイザのヒントと組み合わせて、クエリの処理方法にさらに影響を与えます。


    1. SQLite参加

    2. トップ7データベース

    3. Psycopg2は、大規模な選択クエリでメモリを使い果たします

    4. 複合キーを使用したWHERE_INクエリ?