如何更高效使用Linq Last()获取Postgres时序库中设备最新位置?
获取搭载TimeScale的Postgres设备最新位置的高效LINQ方案
我有一个搭载TimeScale的大型Postgres设备数据表,需要获取设备的最新位置。已知最高效的方案是通过TimeScale每日持续聚合并保存最新位置,但本次暂不讨论该方案。
我使用LINQ执行SQL查询,针对60台设备测试了三种获取设备最新位置的方法,各方法表现如下:
LINQ的Last()方法:耗时132秒,需占用大量内存。原因是
Last()无法被LINQ转换为SQL,会在客户端计算,导致数据库与程序间产生大量数据传输。
代码:gpsPositionDto.Latitude = _context.MeasureValues.Last(c => c.MachineId == machine && c.MeasureValueId == 80).Value;LINQ的OrderByDescending().First()方法:耗时114秒,计算在数据库端完成,无大量数据传输,但数据库需占用较多内存。
代码:gpsPositionDto.Latitude = _context.MeasureValues.OrderByDescending(c => c.Timestamp).First(c => c.MachineId == machine && c.MeasureValueId == 80).Value;LINQ的First()方法:耗时30秒,但无法得到正确结果,仅用于测试耗时参考。
代码:gpsPositionDto.Latitude = _context.MeasureValues.First(c => c.MachineId == machine && c.MeasureValueId == 80).Value;
我希望找到耗时与First()相近但能获取正确数据的方法,该函数每小时需执行一次,且后续设备数量还会持续增加。
内容的提问来源于stack exchange,提问作者Rafael Eberle
相关产品推荐
相关产品推荐

