perf(/latestSteamInstantList): 优化查询设备最新记录的性能,避免全表扫描

修改 SQL 查询方式,从设备表驱动并使用 CROSS APPLY 获取每个设备的最新记录
移除 Java 服务层不必要的过滤逻辑,直接使用优化后的查询结果
master
zch 2 days ago
parent c41441be89
commit a334caaa20

@ -114,16 +114,9 @@ public class EmsRecordSteamInstantServiceImpl implements IEmsRecordSteamInstantS
List<EmsRecordSteamInstant> emsRecordSteamInstants = new ArrayList<>(); List<EmsRecordSteamInstant> emsRecordSteamInstants = new ArrayList<>();
//判断监控编码是否为空 //判断监控编码是否为空
if (monitorCode == null){ if (monitorCode == null){
//没有选择设备monitorCode为空的时候分组查询全部设备的最新一条记录 //没有选择设备monitorCode为空的时候从设备表驱动查询每个设备的最新一条记录
List<EmsRecordSteamInstant> allEmsRecordSteamInstants = emsRecordSteamInstantMapper emsRecordSteamInstants = emsRecordSteamInstantMapper
.selectEmsRecordLatestSteamInstantList(emsRecordSteamInstant); .selectEmsRecordLatestSteamInstantList(emsRecordSteamInstant);
//遍历查询结果
for (EmsRecordSteamInstant recordSteamInstantallEmsRecordSteamInstants : allEmsRecordSteamInstants){
//如果有设备名称就添加到返回集合中
if (recordSteamInstantallEmsRecordSteamInstants.getMonitorName() != null){
emsRecordSteamInstants.add(recordSteamInstantallEmsRecordSteamInstants);
}
}
}else { }else {
//选择了设备monitorCode不为空的时候根据monitorCode查询指定设备的最新一条记录 //选择了设备monitorCode不为空的时候根据monitorCode查询指定设备的最新一条记录
emsRecordSteamInstants = emsRecordSteamInstantMapper emsRecordSteamInstants = emsRecordSteamInstantMapper

@ -213,7 +213,7 @@
</select> </select>
--> -->
<!-- 查询每个设备的最新一条记录 --> <!-- 查询每个设备的最新一条记录:从设备表驱动,每个设备只取 TOP 1避免全表扫描 -->
<select id="selectEmsRecordLatestSteamInstantList" parameterType="EmsRecordSteamInstant" resultMap="EmsRecordSteamInstantResult"> <select id="selectEmsRecordLatestSteamInstantList" parameterType="EmsRecordSteamInstant" resultMap="EmsRecordSteamInstantResult">
SELECT SELECT
ersi.obj_id, ersi.obj_id,
@ -230,15 +230,14 @@
ersi.difference_press, ersi.difference_press,
ersi.record_time ersi.record_time
FROM FROM
ems_record_steam_instant ersi ems_base_monitor_info ebmi
LEFT JOIN ems_base_monitor_info ebmi ON ersi.monitor_code = ebmi.monitor_code CROSS APPLY (
INNER JOIN ( SELECT TOP 1 *
SELECT monitor_code, MAX(obj_id) AS max_obj_id
FROM ems_record_steam_instant FROM ems_record_steam_instant
GROUP BY monitor_code WHERE monitor_code = ebmi.monitor_code
) ersi_max ON ersi.monitor_code = ersi_max.monitor_code AND ersi.obj_id = ersi_max.max_obj_id ORDER BY obj_id DESC
ORDER BY ersi.monitor_code ASC; ) ersi
ORDER BY ersi.monitor_code ASC
</select> </select>
</mapper> </mapper>

Loading…
Cancel
Save