大数据量下的查找最新的几条数据的通用方法

由于项目需要,需要获取一组数据的的最新一条数据,表结构如下:

[sql]  view plain copy
  1. CREATE TABLE [dbo].[WUSU_SUOLITest_Table](  
  2.     [ID] [bigint] IDENTITY(1,1) NOT NULL,  
  3.     [ReceiveTime] [datetime] NULL,  
  4.     [GroupID] [bigintNOT NULL,  
  5.     [DataValue] [floatNULL,  
  6.     [SensorCode] [char](10) NOT NULL,  
  7. )  
在这个表上只有两种操作,插入和查询,没有删除和更新。而且同一种设备,随着id列的变大,ReceiveTime也随着变大。
每一个不同的SensorCode代表了一个设备,目前有50个设备,每30秒上报一次数据,ReceiveTime代表上报数据的时间,现在需要获取每一个设备最新一次的数据,

  开始我使用如下的查询语句:  

[sql]  view plain copy
  1. select * from  WUSU_SUOLITest_Table where id in (select max(id) from  WUSU_SUOLITest_Table group by SensorCode )  
 在数据量比较小时,是没有问题的,但数据量特别大时,这种方式,目前一天的数据就超过了14万,有很大的延时,即使在id上有聚集索引,SensorCode上使用了分区,依然没有多大作用。时间主要花费到了group by上。

  实在想不多到什么好的而解决方法,就只能在此表上创建一个触发器,每次插入数据时就把最新的数据放在了一个临时表,又由于临时表最多只有50条数据,速度当然就很好了。 

[sql]  view plain copy
  1. create TRIGGER [dbo].[UpdateWUSU_LastOriginalDataSUOLI]  
  2.    ON  [dbo].[WUSU_SUOLITest_Table]  
  3.    AFTER  INSERT  
  4. AS   
  5. BEGIN     
  6.     declare @SensorCode char(10), @DataValue float ,@ReceiveTime datetime ,@GroupID bigint  
  7.       
  8.     select @SensorCode=SensorCode,@DataValue=DataValue,@ReceiveTime=ReceiveTime,@GroupID=GroupID from inserted  
  9.       update WUSU_LastOriginalData set DataValue=@DataValue,ReceiveTime=@ReceiveTime,GroupID=@GroupID  
  10.           where SensorCode=@SensorCode  
  11. END  

当然这是为了获取各种设备最新的一条数据,如果要获取最新的两条数据,最多也就是100条记录,一次类推,只需要把上边的触发器修改一下就可以。

但还有没有更好的方式,在不修改表结构的情况下?目前还没有想到。

有人提供了使用关联子查询的方式,确实比group by好多了,但当数据量大时,十天的数据,依然会很慢,大约20多秒。

[sql]  view plain copy
  1. select * from WUSU_SUOLITest_Table as t   
  2. where id  = (select max(id) from WUSU_SUOLITest_Table where SensorCode=t.SensorCode )  

讨论贴参考点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值