大数据量下的查找新的几条数据的通用方法
作者:网络转载 发布时间:[ 2012/9/7 11:47:08 ] 推荐标签:
由于项目需要,需要获取一组数据的的新一条数据,表结构如下:
CREATE TABLE [dbo].[WUSU_SUOLITest_Table](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[ReceiveTime] [datetime] NULL,
[GroupID] [bigint] NOT NULL,
[DataValue] [float] NULL,
[SensorCode] [char](10) NOT NULL,
)
在这个表上只有两种操作,插入和查询,没有删除和更新。而且同一种设备,随着id列的变大,ReceiveTime也随着变大。
每一个不同的SensorCode代表了一个设备,目前有50个设备,每30秒上报一次数据,ReceiveTime代表上报数据的时间,现在需要获取每一个设备新一次的数据,
开始我使用如下的查询语句:
select * from WUSU_SUOLITest_Table where id in (select max(id) from WUSU_SUOLITest_Table group by SensorCode )
在数据量比较小时,是没有问题的,但数据量特别大时,这种方式,目前的数据超过了14万,有很大的延时,即使在id上有聚集索引,SensorCode上使用了分区,依然没有多大作用。时间主要花费到了group by上。
实在想不多到什么好的而解决方法,只能在此表上创建一个触发器,每次插入数据时把新的数据放在了一个临时表,又由于临时表多只有50条数据,速度当然很好了。
create TRIGGER [dbo].[UpdateWUSU_LastOriginalDataSUOLI]
ON [dbo].[WUSU_SUOLITest_Table]
AFTER INSERT
AS
BEGIN
declare @SensorCode char(10), @DataValue float ,@ReceiveTime datetime ,@GroupID bigint
select @SensorCode=SensorCode,@DataValue=DataValue,@ReceiveTime=ReceiveTime,@GroupID=GroupID from inserted
update WUSU_LastOriginalData set DataValue=@DataValue,ReceiveTime=@ReceiveTime,GroupID=@GroupID
where SensorCode=@SensorCode
END
当然这是为了获取各种设备新的一条数据,如果要获取新的两条数据,多也是100条记录,一次类推,只需要把上边的触发器修改一下可以。
但还有没有更好的方式,在不修改表结构的情况下?目前还没有想到。
有人提供了使用关联子查询的方式,确实比group by好多了,但当数据量大时,十天的数据,依然会很慢,大约20多秒。
select * from WUSU_SUOLITest_Table as t
where id = (select max(id) from WUSU_SUOLITest_Table where SensorCode=t.SensorCode )
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11