2012-01-27 10 views
1

誰も私にこれを少し速く走らせる方法の指針を教えてもらえますか?遅いラムダ式

return mb_entities.prospects. 
     FirstOrDefault(x => x.address == person.Add && 
       x.homePhone == person.HPhone && 
       x.bizPhone == person.BPhone && 
       x.cellPhone == person.CPhone && 
       x.city == person.City && 
       x.state == person.State && 
       x.zip == person.Zip && 
       x.email == person.Email && 
       x.firstName == person.FName && 
       x.lastName == person.LName && 
       x.middleName == person.MName && 
       x.genCode == person.GC) ?? new prospect(); 

今は160から180ミリ秒で実行されます。私が1000回それをしなければならないなら、これは大丈夫でしょう。

ヒントをいただければ幸いです。ありがとう!

+1

160ミリ秒は本当に長いです。クライアント側で結果をフィルタリングする処理を行っているようです。私はあなたの条件に一致する行だけを返すdb-queryを作成します。 –

+1

別のマイナーチェップ:基準を最も選択の少ない順に並べ替えることで、 '&&'演算子の短絡がより早く起こるようにします。 –

+0

あなたは何をしているのですか? –

答えて

7

最も選択的な列(電子メール、郵便番号、姓など)にインデックスを作成します。これはそれをスピードアップします。複数の列の1つの索引にする必要があります。

テーブルには、これを1回実行するのに160msかかる大量のレコードが必要です。これは、インデックスが存在しない場合でも、異常に長いです。

+0

かなり大きいテーブルですね。数十万レコード...チップをありがとう、私は今試しに行くつもりだ! – CrowderSoup

+0

ほとんどの場合、パフォーマンスを損なうことがない限り、where句に現れ、*索引付けすることができる*列は索引付けする必要があります。データベース操作の大部分を占めるselectのパフォーマンスの向上は驚異的です。 –

+2

スペース上の理由から、サブセットのみのインデックス作成をお勧めします。索引がまったく1つの行を戻す場合、または5つの不必要な行を戻す場合は、大きな違いはありません。それが大きいので、NCインデックスでテーブル全体を複製するように彼に勧めません。 – usr