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

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

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 )

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-20 05:38:44

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

大数据量下的分页

分页|数据 对于非常大的数据模型而言,分页检索时,每次都加载整个数据源非常浪费.通常的选择是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行. 本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页,为了便于实现演示,数据表采用了Northwind数据库的Orders表(830条记录). 如果数据表中有唯一的自增索引,并且这个字段没有出现断号现象.检索页面大小的块区数据就非常简单了.通过简单的Sql语句就可以实现这个功能:select * from

关于大数据量下Core Data的数据迁移

Core Data版本迁移基础 通常,在使用Core Data的iOS App上,不同版本上的数据模型变更引发的数据迁移都是由Core Data来负责完成的.这种数据迁移模式称为Lightweight Migration(可能对于开发人员来说是lightweight),开发人员只要在添加Persistent Store时设置好对应选项,其它的就交付给Core Data来做了: 从命名上可以看出这两个选项分别代表:自动迁移Persistent Store,以及自动创建Mapping Model.

大数据量下的数据库查询与插入如何优化? (整理)

数据库经常要做一些查询与插入,但是如果查询和插入的数据量过大的时候就会引发数据库性能问题,降低数据库工作效率.因此性能调优是大家在工作中都能够预见的问题,大到世界五百强的核心系统,小到超市的库存系统,几乎都会有要调优的时候.面对形形色色的系统,林林总总的需求,调优的手段也是丰富多彩. 1.尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询 2.避免频繁创建和删除临时表,以减少系统表资源的消耗. 3.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理. 4.建立高效的索引

大数据量下高并发同步的讲解(不看,保证你后悔)(转)

  对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步 1.同步和异步的区别和联系 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步,执行完函数或方法后

大数据量下MySQL插入方法的性能比较

文章讲的是大数据量下MySQL插入方法的性能比较,不管是日常业务数据处理中,还是数据库的导入导出,都可能遇到需要处理大量数据的插入.插入的方式和数据库引擎都会对插入速度造成影响,本文旨在从理论和实践上对各种方法进行分析和比较,方便以后应用中插入方法的选择. 插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: ·连接:(3) ·发送查询给服务器:(2) ·分析查询:(2) ·插入记录:(1x记录大小) ·插入索引:(1x索引) ·关闭:(1) 如果我们每插入一条都

sql语句问题,怎么将查询出来的数据,只取第2第3条数据

问题描述 sql语句问题,怎么将查询出来的数据,只取第2第3条数据 SELECT date_format(createTime,'%Y-%m-%d') createTime from t_zx_sqzx where communityId='8' GROUP BY date_format(createTime,'%Y-%m-%d') DESC ![图片说明](http://img.ask.csdn.net/upload/201509/10/1441849698_218829.jpg) 这是从数据

java- 录入数据自动回车 怎么把其当作一条数据放到后台进行处理

问题描述 录入数据自动回车 怎么把其当作一条数据放到后台进行处理 页面上录入数据 用的是扫描枪 扫一条会自动回车 然后再扫 这样的话 我后台怎么去处理这些数据,怎么把一次回车当作一条数据呢(java语言). 解决方案 用String.split对\n进行切割 解决方案二: 参考JAVA读取USB扫描枪监听键盘录入事件,在public void onKey(int keyCode)中判断keyCode是否为13(即回车),然后做相应的处理. 解决方案三: http://blog.sina.com.

大数据量下的SQL Server数据库自身优化

1.1:增加次数据文件 从SQL SERVER 2005开始,数据库不默认生成NDF数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录分开存储在不同的数据文件里 由于CPU和内存的速度远大于硬盘的读写速度,所以可以把不同的数据文件放在不同的物理硬盘里,这样执行查询的时候,就可以让多个硬盘同时进行 查询,以充分利用CPU和内存的性能,提高查询速度. 在这里详细介绍一下其写入的原理,数据文件

Lucene的分页功能怎么这么局限啊,大数据量下会内存溢出,而且很慢!!!!谁能解释下,谢谢

问题描述 大家说说Lucene针对以下这种大数据量分页场景,有没有必要改进的...真的很痛苦!我们的项目就要求用lucene,不用oracle,数据量又大,分页这里是个性能瓶颈,搞不定啊!TopScoreDocCollectorf=TopScoreDocCollector.create(10000010,false);indexSearcher.search(query,f);TopDocstopDocs=f.topDocs(10000000,10000010);​遇到这种大数据量问题,很痛苦,