2

私は Entity Framework (Code First) を使用して ASP.Net アプリケーションを構築しており、この例のようなリポジトリ パターンを実装しました。

データベースには 2 つのテーブルしかありません。呼び出されSensorたものと呼び出されたものMeasurePoint( と のみTimeStampを含むValue)。センサーは複数の測​​定ポイントを持つことができます。現時点では、5 つのセンサーと約 15000 の測定ポイント (センサーごとに約 3000 ポイント) があります。

私の MVC コントローラーの 1 つで、次の行を実行します (センサーの最新の MeasurePoint を取得するため)。

DbSet<Sensor> dbSet = context.Set<Sensor>();
var sensor = dbSet.Find(sensorId);
var point = sensor.MeasurePoints.OrderByDescending(measurePoint => measurePoint.TimeStamp).First();

この呼び出しの実行には約 1 秒かかります。呼び出しの結果は、次の SQL クエリになります。

SELECT 
[Extent1].[MeasurePointId] AS [MeasurePointId], 
[Extent1].[Value] AS [Value], 
[Extent1].[TimeStamp] AS [TimeStamp], 
[Extent1].[Sensor_SensorId] AS [Sensor_SensorId]
FROM [dbo].[MeasurePoint] AS [Extent1]
WHERE ([Extent1].[Sensor_SensorId] IS NOT NULL) AND ([Extent1].[Sensor_SensorId] = @EntityKeyValue1)

これは実行に約 200 ミリ秒しかかからないため、その時間は別の場所で費やされます。

Visual Studio Profiler を使用してコードをプロファイリングしたところ、遅延の原因となっている呼び出しが

System.Data.Objects.Internal.LazyLoadBehavior.<>c_DisplayClass7`2.<GetInterceptorDelegate>b_1(!0,!1)

だから、遅延読み込みと関係があると思います。このようなパフォーマンスを維持する必要がありますか、それとも改善できる点はありますか? パフォーマンスの低下を引き起こすのは時間による順序付けですか?そうであれば、どのようなオプションがありますか?

更新: コードを更新して、どこsensorから来たのかを示しました。

4

2 に答える 2

1

それが実行中のクエリである場合、センサーのメモリに 3000 ポイントすべてをロードしています。ナビゲーション プロパティを使用する代わりに、DbContext で直接クエリを実行してみて、パフォーマンスの違いを確認してください。オーバーヘッドは、ロードする必要のない 2999 ポイントから発生している可能性があります。

于 2012-10-01T12:51:22.253 に答える