qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

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

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

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 )

posted on 2012-09-10 09:48 顺其自然EVO 阅读(343) 评论(1)  编辑  收藏 所属分类: 数据库

评论

# re: 大数据量下的查找最新的几条数据的通用方法 2012-10-09 06:09 周萍英

那如果查询的是历史数据,如:12天前的数据,它是不是就到历史表中去查询呢?速度还有这么快吗?
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜