2016-07-21 22 views
0

2台のコンピュータで同じデータベース設定を使用しています。同じテーブル。同じインデックス。私は自分が参加しているクエリを実行しています:SQL Serverの論理的読み取り

SELECT Column1 
     ,Column2 
     ,Column3 
     ,Column4 
     ,RowID = RowNumber OVER (Partition By Column1, ORDER BY Column2) 
    INTO #tmp 
    FROM AuditTable 

    SELECT * 
    FROM #tmp t1 
    JOIN #tmp t2 ON t2.Column1 = t1.Column1 
       AND t2.RowiD = t1.RowID +1 

我々は1データベース/サーバ上2万行でこのクエリを実行し、それが周りに320万を読み込む論理的に完了するまでに2分かかります。
同じクエリは、150,000レコードの異なるデータベース/サーバー上で実行され、2番目の論理レコードは2240で返されます。同じテーブル設定(インデックス/フラグメンテーション/統計情報を含む)で同じクエリを実行するサーバーは、 2つの異なるサーバーで異なっている

+1

実行計画はどのように見えますか? –

+0

あなたは同じマシンから両方のデータベースにアクセスしていますか? –

+0

AuditTableに20,000行、または20,000行ありますか? – SQLChao

答えて

1

サーバーのパフォーマンスが異なる理由はわかりません。

ただし、SQL Serverの2012+に、あなたはLAG()を使用する必要があります。

SELECT Column1, Column2, Column3, Column4, 
     LAG(Column2) OVER (PARTITION BY Column1 ORDER BY Column2) as prev_Column2, 
     LAG(Column3) OVER (PARTITION BY Column1 ORDER BY Column2) as prev_Column3 
FROM AuditTable; 

そして、あなたにインデックスを追加しようとしている場合を除き、SQL Serverののためのバージョンでは、あなたは、一時テーブルを使用しないでくださいそれはパフォーマンスのためです。 CTEはより簡単であり、中間結果を具体化する必要はありません。

関連する問題