0

LINQ を使用してページングを実装していますが、発生する可能性のあるパフォーマンスの問題について考えていました。ページ サイズが 10 で、テーブルに 100 個のレコードがあるとします。次を使用する場合

var myList = _dataContext.Person.Skip(PageNumber * PageSize).Take(10);

必要なデータを取得します。このシナリオを 1,000,000 レコードに適用するとします。これはパフォーマンスに影響しますか?パフォーマンスに関しては、SQLストアドプロシージャを使用する価値がはるかに高いでしょうか?

4

2 に答える 2

2

これは、スキップして取得する前に、データベースからすべての行を返すわけではありません。ToListの後にを実行.Personすると、非常に非効率的になります。あなたがそこに持っているものは大丈夫なはずです

于 2012-11-06T11:26:16.367 に答える
1

ストアド プロシージャには、Linq プロバイダーによって生成されるプレーンな SQL テキストに勝る利点はありません。

ところで、次のSQLのようなクエリが生成されます

SELECT /* [t0] fields */
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY /* [t0] fields */
    FROM [Person] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

また、変数を使用する場合にのみ実行されmyListます (例: call ToList()Count()、enumerate)。したがって、データベースに何人の人がいるかは関係ありません (まあ、問題ですが、これはメモリ内のオブジェクトではなく db の部分です)、ストアド プロシージャの使用によるパフォーマンスの向上はありません。

于 2012-11-06T11:26:19.677 に答える