2016-11-20 10 views
0

本番環境ではこのクエリが非常に遅いです。私は理由を知りたいし、同じ結果を達成するためのよりよい方法があるかどうかを知りたい。linq to SQLクエリが遅いのはなぜですか?

public async Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email) 
{ 
    return await (from m in this.Queryable() 
        where m.Email == email 
         && (m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL1ID) 
          || m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL3ID) 
          || m.RoleMemberships.Select(r => r.RoleId).Contains(RoleConstants.ACCESSGRANTEDL4ID)) 
        select m).SingleOrDefaultAsync(); 
} 

つまり、このクエリの目的は、電子メールでユーザーのメンバーシップを取得し、ログインに進むことです。私はユーザーのメンバーシップを持っている以上、このクエリは遅くなります。

ありがとう、

デビッド

編集

this.Queryable()select * from Membershipsを実行するのと同じです。 Membershipテーブルには多数のロールがあり、ロールには多数のメンバーシップがあります。

また、メンバシップテーブルは、240行のログイン情報を取得するのに最大12秒かかります。電子メールの値はシステム内で一意ではないので、ロールでフィルタリングする必要があります。一部のロールのみがログインにアクセスでき、これらのロールには固有の電子メールが設定されます。これが私がフィルタリングしなければならない理由です。このクエリは、上記のクエリで選択されたログインに進むために1つのメンバシップを返します。だからIQueryable,IEnumerableまたはList、ちょうどSingleOrDefaultの値。

+0

'this.Queryable()' ???あなたは多くの情報を提供していない.. 'これは何ですか? 'Queryable()'メソッドは何を返しますか?そのコードを表示しますか? – user3185569

+0

申し訳ありません!このコードはリポジトリアーキテクチャ内にあります。私は編集セクションでさらに情報を与えました。 –

+0

おそらく、SQLテーブル定義とインデックスの両方を参照する必要があります。 – RBarryYoung

答えて

3

私はあなたが同じことにある複数回やっているので、生成されたクエリは、非常に悪いだと思う:

public Task<Membership> FindByEmailByAccessL1OrL3OrL4Async(string email) 
{ 
    return (from m in this.Queryable() 
      where m.Email == email 
       && (m.RoleMemberships.Any(
        r => r.RoleId == RoleConstants.ACCESSGRANTEDL1ID 
         || r.RoleID == RoleConstants.ACCESSGRANTEDL3ID 
         || r.RoleID == RoleConstants.ACCESSGRANTEDL4ID) 
      select m).SingleOrDefaultAsync(); 
} 

m.RoleMemberships.Select(r => r.RoleId) 

代わりに、一度使用してそれを行うことができますが私は思うより良いものになります。どちらの場合も、デバッガを使用して生成されたクエリを確認できます。

また、結果を待つ必要はなく、タスクを返すだけで、発信者が待つ必要があることに注意してください。

+0

「非常にバンドです」 - 「悪い」「広い」か何か他の意味ですか? –

+0

@ MarkSchultheissタイポが修正されました。それを指摘してくれてありがとう。 – user3185569

0

私はロードするデータが多く、興味深いクエリを作成する非常に遅いマッピングテクノロジであると思います(これはhereです)。パフォーマンスに問題がありますか?多分、他のマッピングテクノロジを選択する必要があります例えばDapper)。テストをしたとき、それはEFより2倍速かった。

+0

ここでEFが遊んでいることをどのように推測しますか? –

+0

もう一度、大規模なデータを持っていると高速ではないので、私はそれがこの状況だと思うのです。 –

関連する問題