.NET 3.5 (顧客の要件) を使用して、次のようなコードがいくつかあります。
void Process (ActionState state)
{
var orderItemQuery = from OrderItem item in order.OrderItems
orderby item.OrderLineNumber ascending
select item;
foreach (OrderItem item in orderItemQuery)
{
ActionData actionData;
switch (state)
{
case ActionState.Prepare:
actionData = (
from ActionData ad in db.ActionDataTable
where ad.ObjectId == item.ProductId
select ad
).First();
case ActionState.QualityCheck:
actionData = (
from ActionData ad in db.ActionDataTable
where ad.ObjectId == item.OrderItemId
select ad
).First();
default:
throw new InvalidOperationException();
}
// ...
}
}
基本的に、最初のクエリの結果が繰り返され、特定の外部キーを使用しActionData
て、現在のActionState
. 実際には、もう少しネストがあり、あちこちにいくつかのチェックがありますが、本質的には同じです。
これは当初、テスト用のデータベースではうまく機能していましたが、顧客からライブ データのコピーが送られてきましたが、非常に遅いです。他の処理を含め、バッチ全体を実行するには約 15 分かかります。パフォーマンス テスターでコードを実行した後、プロセス全体の中で最も遅い部分は、.First()
各ケースの呼び出しであることがわかりました。
これが単純な SQL の場合、 の値に基づいてループの外でストアド プロシージャをコンパイルしstate
、それを使用します。それができないので、代替手段は何ですか?どうすればこれをスピードアップできますか?