私は 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
から来たのかを示しました。