2

LINQ クエリを最適化する良い方法があるかどうか疑問に思っています。次のような LINQ クエリを使用して、データベースからデータを取得しています。

// PKs is a list of integers   
var import = context.table.Where(x => PKs.Contains(x.PrimaryKey)).AsEnumerable();

これにより、次のような SQL 呼び出しが発生すると (誤って) 想定しました。

SELECT * from table where PrimaryKey in (PK[1], PK[2], ...)

つまり、1 つのデータベース ヒット。Glimpseを使用して SQL 呼び出しを調べると、LINQ クエリが多くの個別の SQL 呼び出しに変換されていることがわかりました。

SELECT * from table where PrimaryKey=PK[1]
SELECT * from table where PrimaryKey=PK[2]
...

個々のクエリは非常に高速に実行されていましたが、整数のリストが大きい (数千単位) ため、オーバーヘッドによるオフセットにより、クエリの実行に約 25 秒かかりました。

データベース呼び出しで時間のかかる LINQ クエリを取り除き、ストアド プロシージャ呼び出しを介してデータをインポートすることにしました。

var import = this.p_import(parameter).ToList();

これにより、データベース呼び出しが 1 回だけだったため、応答時間が約 25 秒から 1 秒未満に劇的に改善されました。

これで問題は解決しましたが、LINQ を使用していたすべての理由は、ストアド プロシージャの使用を避けるためでした。LINQ クエリを最適化するより良い方法はありますか?

4

2 に答える 2

4

結合に変更すると、物事はよりスムーズに進むはずです。

context.table.Join(PKs,t => t.PrimaryKey, pk => pk, (t, pk) => t).AsEnumerable()

Linq2Sql は、POCO リストへのエンティティの結合をサポートしていませんが、EF でテストしただけで、すべて問題ありません。

Linq2Sql では、Contains.

于 2013-10-18T11:09:08.067 に答える
0

EF 4 は IN クエリ変換をサポートする必要があります。EF の Contains で問題が発生したことはありませんが、以前のバージョンでは正しくサポートされていないようです。

詳細と考えられる解決策については、こちらをご覧ください

于 2013-10-18T11:14:51.030 に答える