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

同じクエリ - 異なる実行プラン

    クエリ 2 は変数を使用します。

    バッチがコンパイルされた時点では、SQL Server は変数の値を認識していないため、OPTIMIZE FOR (UNKNOWN) と非常によく似たヒューリスティックにフォールバックします。

    > の場合 行の 30% が最終的に一致すると想定します (またはサンプル データでは 3000 行)。これは、以下の実行計画の画像で確認できます。これは、転換点 クラスター化インデックス スキャンを使用するか、非クラスター化インデックス シークおよびキー ルックアップを使用するかで、このクエリに対して。

    OPTION (RECOMPILE) を使用する必要があります 以下の 3 番目の計画に示すように、実際の変数値を考慮に入れるようにします。

    スクリプト

    CREATE TABLE #Sale
    (
        SaleId INT IDENTITY(1, 1)
            CONSTRAINT PK_Sale PRIMARY KEY,
        Test1 VARCHAR(10) NULL,
        RowVersion rowversion NOT NULL
            CONSTRAINT UQ_Sale_RowVersion UNIQUE
    )
    
    /*A better way of populating the table!*/
    INSERT INTO #Sale (Test1)
    SELECT TOP 10000 NULL 
    FROM master..spt_values v1, master..spt_values v2
    
    GO
    
    SELECT *
    FROM #Sale
    WHERE RowVersion > 0x000000000001C310-- Query #1
    
    
    DECLARE @LastVersion rowversion = 0x000000000001C310
    
    SELECT *
    FROM #Sale
    WHERE RowVersion > @LastVersion-- Query #2
    
    
    SELECT *
    FROM #Sale
    WHERE RowVersion > @LastVersion
    OPTION (RECOMPILE)-- Query #3
    
    DROP TABLE #Sale
      

    1. Laravelの移行/db:シードが非常に遅い

    2. MySQL WorkbenchによってエクスポートされたCREATEスクリプトで、別のコンピューターで構文エラーが発生しました

    3. t-sql(SQL Server)ストアドプロシージャをpgsql(postgre sql)に変換するツール

    4. マーカーを座標で100メートル移動する方法