データベースの特定の設計構造が原因で、EF のパフォーマンスが非常に低下しています。関連する関係は次のとおりです。
次のデータモデルがあります。
public class Sensor
{
[Key]
public int Id { get; set; }
[Required, MaxLength(64)]
public string Name { get; set; }
[Required, ForeignKey("Type")]
public int SensorTypeId { get; set; }
public virtual SensorType Type { get; set; }
public virtual ICollection<SensorSample> SensorSamples { get; set; }
}
public class SensorSample
{
[Key]
public int Id { get; set; }
[Required, ForeignKey("Sensor")]
public int SensorId { get; set; }
public virtual Sensor Sensor { get; set; }
[Required]
public DateTime SampleTime { get; set; }
[Required]
public virtual ICollection<SampleData> SampleData { get; set; }
}
public class SampleData
{
[Key]
public int Id { get; set; }
[Required, ForeignKey("DataType")]
public int SampleDataTypeId { get; set; }
public virtual SampleDataType DataType { get; set; }
[Required, ForeignKey("Unit")]
public int SampleUnitId { get; set; }
public virtual SampleUnit Unit { get; set; }
[Required, ForeignKey("Sample")]
public int SensorSampleId { get; set; }
public virtual SensorSample Sample { get; set; }
[MaxLength(128)]
public string Value { get; set; }
}
SensorSample
は複数のデータ サンプル タイプ(温度、圧力など)を持つことができるため、はINSERT
既存のサンプルを照会して正しい と適切に関連付ける必要がありますSampleTime
。これは、次のコードを使用して行われます。
SensorSample sample = null;
foreach (var d in input)
{
SampleData data = new SampleData();
data.SampleDataTypeId = dataTypeId;
data.SampleUnitId = unitId;
data.Value = d.Value;
// check for existing sample for this sensor and timestamp
sample = SensorSamples.FirstOrDefault(s => s.SensorId == sensor.Id && s.SampleTime == d.Timestamp);
if (sample == null)
{
// sample doesn't exist, create a new one
sample = new SensorSample();
sample.SampleTime = d.Timestamp;
sample.SensorId = sensor.Id;
sensor.SensorSamples.Add(sample);
}
// add the data to the sample
sample.SampleData.Add(data);
}
サンプル データの挿入をバッチ処理 (つまり、一度に 1000 レコード) で最適化しようとしました。これは役に立ちますが、フィールドにインデックスがあっても、SampleTime
レコードが追加されるにつれてルックアップ クエリに時間がかかるようです。
私の質問は、サンプル データをデータベースに追加する際の設計やパフォーマンスを改善するにはどうすればよいかということです。一対多の関係を処理するためのより良いデータベース構造はありますか? パフォーマンスの適切なオフセットが得られるのであれば、データベースの設計についていくらか妥協しても構わないと思っていますが、それでも、特定の に関連付けられたさまざまなデータを処理できる必要がありますSampleTime
。