Azure SQL Server中SCADA移动端获取站点最新30条告警异常咨询
SCADA告警页面无法获取最新记录
我有一个运行在手机上的SCADA应用,打开某客户站点的告警页面时,需要展示该站点最新30条告警。之前用视图实现这个功能,但现在视图返回不了新记录。查询用了TOP函数,数据库是部署在微软Azure上的SQL Server虚拟数据库。
SCADA应用中grid对象的查询语句
ALARMHISTORYVIEW WHERE al_tag LIKE '{SoPump_ptr.label}%' ORDER BY al_event_time DESC
注:该grid支持用TOP (30)函数将结果限制为最新30条记录。
SQL Server中ALARMHISTORYVIEW视图定义
SELECT TOP (1000) Al_Event_Time, Al_Message, Al_Tag, Al_Start_Time, Al_Norm_Time, Al_Ack_Time, Al_Station FROM dbo.ALARMHISTORY WHERE (Al_Station LIKE '%Clearscada-A%') GROUP BY Al_Event_Time, Al_Message, Al_Tag, Al_Start_Time, Al_Norm_Time, Al_Ack_Time, Al_Station
问题原因
视图里的TOP (1000)没搭配ORDER BY子句,SQL Server会以非确定性的逻辑返回前1000条记录。新告警产生后,因为视图没有明确按时间倒序取数,新记录可能排不进这1000条结果里,导致应用查不到。另外原视图里的GROUP BY完全多余——所有字段都在分组条件中,和直接查询效果一致,反而会拖慢性能。
修复方法
修改视图,明确排序规则
给视图加上ORDER BY Al_Event_Time DESC,确保最新告警优先被纳入结果。要么直接去掉TOP (1000)限制,让应用层的TOP (30)控制数量;如果必须保留TOP,就设一个远大于30的值(比如TOP (10000)),同时加上排序:SELECT Al_Event_Time, Al_Message, Al_Tag, Al_Start_Time, Al_Norm_Time, Al_Ack_Time, Al_Station FROM dbo.ALARMHISTORY WHERE (Al_Station LIKE '%Clearscada-A%') ORDER BY Al_Event_Time DESC优化应用查询
确保应用的grid查询明确带上TOP (30),不要依赖视图的TOP限制:SELECT TOP (30) * FROM ALARMHISTORYVIEW WHERE al_tag LIKE '{SoPump_ptr.label}%' ORDER BY al_event_time DESC删除多余的GROUP BY
原视图的GROUP BY没有实际作用,删掉后能提升查询效率,避免不必要的计算。
内容的提问来源于stack exchange,提问作者euggeneb
相关产品推荐
相关产品推荐

