2016-08-16 16 views
0

データベースに日付フィールド(VisitDate)を持つテーブルがあります。私は次のSQLクエリを実行すると、私は1秒で結果を受け取ります(Visual Basicで)私のASP.Netコードで、GroupBy()が極端に遅い

select year(VisitDate), month(visitDate) 
from GABrowser 
group by year(VisitDate), month(visitDate) 

しかし、フォローは実行に12秒かかる:

Dim stats = db.GABrowsers.GroupBy(Function(s) New With {s.VisitDate.Value.Year, s.VisitDate.Value.Month}) 

'(Takes 12 seconds to enter in the For loop) 
For Each stat In stats 

Next 

私はなぜそれが長くかかるのかわかりません。私のウェブページの読み込みが極端に遅くなっています。

+0

実際にSQL Serverが何をしているか確認してください。 SQLプロファイラを実行して、アプリケーションがSQL Serverに送信するコマンドを確認できますか?その後、何が実行され、どのくらいの期間表示されます。 –

+0

VisitDate用のクラスタ化インデックスを作成し、EFプロファイラでSQLクエリを投稿してください –

+0

SQLプロファイラについて聞いたことがありません。これはどこで実行しますか? – AskYous

答えて

3

SQLクエリとLINQクエリは同じではありません。

SQLクエリは、year(VisitDate)month(visitDate)を返します。 LINQ内のGroupByは異なりますが、フルエンティティをグループ化条件でグループ化して返します。

LINQの結果では、db.GABrowsers個のエンティティが同じグループs.VisitDate.Value.Years.VisitDate.Value.Monthで表示されます。 LINQステートメントによって生成されたSQLクエリは、最初のSQLクエリよりも(フィールド内で)はるかに広いことがわかります。

これに加えて(より大きなSQL結果セット)、EFがデータベースからのデータを処理しエンティティオブジェクトをマテリアライズするのに時間がかかります。

+1

同等のLINQクエリを投稿した方が便利だと思います。 – Enigmativity

+1

クエリの最後に '.Select(Function(g)g.Key)'を追加するだけです。 –

+0

@IvanStoev OPがLINQ文と同じ結果を実際に望んでいるのか、SQL文を試しているのかわかりません。 'For'ループで何が起こるのか興味深いでしょう。もちろん、SQL結果を再現したい場合は、「Key」を選択するとそれが実行されます。 –

関連する問題