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

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

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

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

Loading…
Cancel
Save