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

WITH ステートメントはクエリごとに 1 回実行されますか、それとも行ごとに 1 回実行されますか?

    例:

    SET NOCOUNT ON;
    SET IMPLICIT_TRANSACTIONS ON;
    
    CREATE TABLE MyTable (MyID INT  PRIMARY KEY);
    GO
    INSERT  MyTable (MyID)
    VALUES  (11), (22), (33), (44), (55);
    
    PRINT 'Test MyCTE:';
    WITH MyCTE
    AS (
        SELECT  *, ROW_NUMBER()OVER(ORDER BY MyID) AS RowNum
        FROM    MyTable
    )
    SELECT  *
    FROM    MyCTE crt
    LEFT JOIN MyCTE prev ON crt.RowNum=prev.RowNum+1;
    
    ROLLBACK;
    

    SSMS で以前のスクリプトを実行した場合 (Ctrl+M を押します) -> 実際の実行計画) を実行すると、最後のクエリの実行計画が取得されます。

    この場合、CTE は crt に対して 1 回実行されます。 prev のエイリアスと 5 回 (!) 回 エイリアス、crt のすべての行に 1 回 .

    では、この質問の答えは

    bothです :クエリごとに 1 回 (crt ) および行ごとに 1 回 (prev :crt から毎回 1 回 ).

    このクエリを最適化するには、まず、1) CTE (MyCTE) からの結果を保存してみてください。 または Query ) テーブル変数または一時テーブルに

    2) このテーブルの主キーを結合列として定義します。

    3) このテーブル変数または一時テーブルを使用するように最終クエリを書き直します。

    もちろん、この CTE 間の自己結合なしで最終的なクエリを書き直すこともできます。




    1. Statement.setFetchSize(nSize)メソッドはSQL Server JDBCドライバーで実際に何をしますか?

    2. 依存オブジェクトがある場合にpostgresでユーザーをドロップする方法

    3. プロキシ経由のMySQLdb

    4. SQL Serverは、既存のテーブルに自動インクリメントの主キーを追加します