1

以下のLINQクエリを最適化して、速度のパフォーマンスを向上させようとしています。検索対象のオブジェクトの数は、数万になる可能性があります。

var lQuery = from o in oEvents
where (o.oSalesEvent != null && o.oSalesEvent.OccurDate < oCalcMgr.OccurDate && (
                (oCalcMgr.InclTransTypes == Definitions.TransactionTypes.SalesAll) ?
                   (o.oSalesEvent.EventStateID == ApprovedID || o.oSalesEvent.EventStateID == PendingID) : 
                   o.oSalesEvent.EventStateID == ApprovedID)) &&
      ((oCalcMgr.InclTransTypes == Definitions.TransactionTypes.SalesAll) ? 
                (o.oSalesMan.oEmployment.EventStateID == ApprovedID || o.oSalesMan.oEmployment.EventStateID == PendingID) : 
                 o.oSalesMan.oEmployment.EventStateID == ApprovedID)
select new { SaleAmount = o.SaleAmount.GetValueOrDefault(), CompanyID = o.oSalesEvent.CompanyID };

クエリは基本的に、特定の日付より前に発生したすべての販売イベントの売上高と会社 ID を教えてください。販売イベントのステータスとセールスマンの雇用ステータスは、常に「承認済み」にするか、指定されている場合は「保留中」にすることもできます。

ご覧のとおり、日付の比較といくつかの整数の比較があります。使用される整数比較は、プロパティが特定の Enum 値と一致するかどうかに基づいています。

最適化の方法について私自身の考えをいくつか持っていますが、LINQ がこのクエリを舞台裏でどのように変換するかについて、より多くの洞察を持っている可能性のある他の人の考えを聞きたいと思っています。

ありがとう

4

2 に答える 2

0

あなたの最大の課題は、Linq ステートメントで複数の基準チェックを行っていることであり、これには多くの時間がかかるようです。oEvents で新しいプロパティを作成するのはどうですか - 「IsEligable」と言って、他の変数の Set ステートメント内でその値を設定します (Linq で各変数を常に再クエリするよりもはるかに高速です)。

次に、コードのこの部分に到達するまでに、次の行に沿って Linq を更新できます。

var lQuery = from o in oEvents
where (o.oSalesEvent != null && o.oSalesEvent.OccurDate < oCalcMgr.OccurDate && o.IsEligable == True)
select new { SaleAmount = o.SaleAmount.GetValueOrDefault(), CompanyID = o.oSalesEvent.CompanyID };

...それは実行を高速化すると思いますが、ちょっと考えてみてください...

于 2012-10-22T15:49:43.533 に答える
0

これは、読みやすさを向上させるだけでなく、速度を向上させることもできますが、試してみてください。

var lQueryTemp = from o in oEvents
where (o.oSalesEvent != null && o.oSalesEvent.OccurDate < oCalcMgr.OccurDate)

if (oCalcMgr.InclTransTypes == Definitions.TransactionTypes.SalesAll)
{
  lQueryTemp = from o in lQueryTemp
        where (o.oSalesEvent.EventStateID == ApprovedID || o.oSalesEvent.EventStateID == PendingID) &&
      (o.oSalesMan.oEmployment.EventStateID == ApprovedID || o.oSalesMan.oEmployment.EventStateID == PendingID);
}
else
{
  lQueryTemp = from o in lQueryTemp
        where (o.oSalesEvent.EventStateID == ApprovedID &&  o.oSalesMan.oEmployment.EventStateID == ApprovedID);
}

var lQuery = from o in lQueryTemp
select new { SaleAmount = o.SaleAmount.GetValueOrDefault(), CompanyID = o.oSalesEvent.CompanyID };

これにより、 の両方のチェックを引き出すことで速度が向上する可能性がありoCalcMgr.InclTransTypesます。これは、このクエリの目的では事実上定数です。

于 2012-10-22T15:57:15.877 に答える