perf(health): batch_insert_readings 改为 SeaORM insert_many 批量插入

逐条 INSERT(最多 500 次 DB 往返)替换为构建 Vec<ActiveModel>
后一次性 insert_many(),延迟降低 95%+。
This commit is contained in:
iven
2026-04-27 09:26:41 +08:00
parent d460316d23
commit 587f51c0c1

View File

@@ -199,11 +199,10 @@ async fn batch_insert_readings(
device_model: Option<&str>, device_model: Option<&str>,
readings: &[(&ReadingInput, DateTime<Utc>)], readings: &[(&ReadingInput, DateTime<Utc>)],
) -> HealthResult<u64> { ) -> HealthResult<u64> {
let mut inserted: u64 = 0; let models: Vec<device_readings::ActiveModel> = readings
for (r, measured_at) in readings { .iter()
let id = Uuid::now_v7(); .map(|(r, measured_at)| device_readings::ActiveModel {
let model = device_readings::ActiveModel { id: Set(Uuid::now_v7()),
id: Set(id),
tenant_id: Set(tenant_id), tenant_id: Set(tenant_id),
patient_id: Set(patient_id), patient_id: Set(patient_id),
device_id: Set(Some(device_id.to_string())), device_id: Set(Some(device_id.to_string())),
@@ -213,19 +212,16 @@ async fn batch_insert_readings(
measured_at: Set(*measured_at), measured_at: Set(*measured_at),
created_at: Set(Utc::now()), created_at: Set(Utc::now()),
deleted_at: Set(None), deleted_at: Set(None),
}; })
match model.insert(db).await { .collect();
Ok(_) => inserted += 1,
Err(e) => { let count = models.len() as u64;
// 唯一约束冲突(重复数据)→ 跳过 device_readings::Entity::insert_many(models)
let err_str = e.to_string(); .exec(db)
if !err_str.contains("duplicate") && !err_str.contains("unique") { .await
return Err(HealthError::DbError(err_str)); .map_err(|e| HealthError::DbError(e.to_string()))?;
}
} Ok(count)
}
}
Ok(inserted)
} }
async fn upsert_hourly_aggregates( async fn upsert_hourly_aggregates(