4

私たちはいくつかの方法を最適化しようとしています。Redgate のパフォーマンス プロファイラーを使用して、パフォーマンス リークを見つけます。

私たちのツールは、いくつかの方法でオブジェクトに Linq を使用します。FirstOrDefaultしかし、オブジェクト数が +/- 1000 のコレクションでは非常に時間がかかることに気付きました。

プロファイラーは、クエリが非常に遅いことも警告します。プロファイラーの結果に画像を追加しました。

コレクションをデータベースに追加してからデータベースにクエリを実行することはできません。推奨事項はありますか?

ありがとう !

private SaldoPrivatiefKlantVerdeelsleutel GetParentSaldoPrivatiefKlantVerdeelsleutel(SaldoPrivatiefKlantVerdeelsleutel saldoPrivatiefKlantVerdeelsleutel, SaldoGebouwRekeningBoeking boeking, int privatiefKlant)
{
    SaldoPrivatiefKlantVerdeelsleutel parentSaldoPrivatiefKlantVerdeelsleutel = null;

    if (saldoPrivatiefKlantVerdeelsleutel != null)
    {
        try
        {
            parentSaldoPrivatiefKlantVerdeelsleutel = saldoPrivatiefKlantVerdeelsleutel.AfrekenPeriode.SaldoPrivatiefKlantVerdeelsleutelCollection
                .FirstOrDefault(s => (boeking == null || (s.SaldoVerdeelsleutel != null &&
                (s.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID == boeking.SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID)))
                && s.PrivatiefKlant.ID == privatiefKlant);
        }
        catch (Exception ex)
        { }
    }

    return parentSaldoPrivatiefKlantVerdeelsleutel;
}

画像: プロフィールレポート

4

4 に答える 4

7

次のように書き換えることで、高速化できるはずです。

saldoPrivatiefKlantVerdeelsleutel.AfrekenPeriode.SaldoPrivatiefKlantVerdeelsleutelCollection
            .Where(s => (boeking == null || (s.SaldoVerdeelsleutel != null &&
                (s.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID == boeking.SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID))) && s.PrivatiefKlant.ID == privatiefKlant)
            .FirstOrDefault()

LINQ .Where(predicate).First() が .First(predicate) よりも速い理由を参照してください。なぜこれが速いのか。

于 2013-08-30T13:14:45.230 に答える
2

私はこれを言います

boeking.SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID

犯人かもしれません。次のように、外部にキャッシュしてみてください。

var id = boeking != null ? boeking.SaldoGebouwRekeningVerdeling.SaldoGebouwRekening.SaldoVerdeelsleutel.GebouwVerdeelSleutel.ID : 0;

クエリ内で使用idします。

(私は推測を行っています: その長いチェーンのプロパティの 1 つは、「あまりスマートではない」何かを実行し、実際には非常に遅いです)

于 2013-08-30T13:20:30.793 に答える