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

上一篇 / 下一篇  2012-09-10 09:15:58 / 个人分类:数据库

51Testing软件测试网4@[(E8a"W@

  由于项目需要,需要获取一组数据的的最新一条数据,表结构如下:51Testing软件测试网-H7ycN8f2~8K$x;D

_9bkVH@{%\i6j0 51Testing软件测试网 A Gy0S+G \

CREATE TABLE [dbo].[WUSU_SUOLITest_Table](
N]GU?!g w p_0 [ID] [bigint] IDENTITY(1,1) NOT NULL,51Testing软件测试网O}5d }Y.F3_{
 [ReceiveTime] [datetime] NULL,
LJ0w.D8_,h r7~g ~/`-nT0 [GroupID] [bigint] NOT NULL,
#H~F |/Vm0 [DataValue] [float] NULL,51Testing软件测试网 D,yH/f:RC@6D
 [SensorCode] [char](10) NOT NULL,51Testing软件测试网og4}v4C|V"vL4d x
)
51Testing软件测试网Y`&@QHYU

  在这个表上只有两种操作,插入和查询,没有删除和更新。而且同一种设备,随着id列的变大,ReceiveTime也随着变大。

d-|%z_@5i%KDp0I0

5b(u oE@6|0  每一个不同的SensorCode代表了一个设备,目前有50个设备,每30秒上报一次数据,ReceiveTime代表上报数据的时间,现在需要获取每一个设备最新一次的数据,

9X-k1xv@ u J(|"_f/l0 51Testing软件测试网{*{D'[On;N*h-e*Q

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

%Gw+]5{'U$Z"J0

A,Rnk)F/vy0

)~6fWyfR P8`0
select * from  WUSU_SUOLITest_Table where id in (select max(id) from  WUSU_SUOLITest_Table group by SensorCode )
51Testing软件测试网 a \3oJ`^NW!s

  在数据量比较小时,是没有问题的,但数据量特别大时,这种方式,目前一天的数据就超过了14万,有很大的延时,即使在id上有聚集索引,SensorCode上使用了分区,依然没有多大作用。时间主要花费到了group by上。51Testing软件测试网-cJ(GNO4Z b

51Testing软件测试网1a,np$Wv{

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

)z6O9ip9w c0Ya0 51Testing软件测试网7k2n0_ @,YP aw

51Testing软件测试网/sZ*h:[Lk

create TRIGGER [dbo].[UpdateWUSU_LastOriginalDataSUOLI]51Testing软件测试网Dp J^)U2z#a
   ON  [dbo].[WUSU_SUOLITest_Table]51Testing软件测试网%Sjw.Y[L
   AFTER  INSERT
!V{wC)O9H0AS 51Testing软件测试网x/z0?JD {
BEGIN 
uU-j:Sx|9F0    declare @SensorCode char(10), @DataValue float ,@ReceiveTime datetime ,@GroupID bigint
B*J/w#by,K x0    51Testing软件测试网'xJ cuLq,[
    select @SensorCode=SensorCode,@DataValue=DataValue,@ReceiveTime=ReceiveTime,@GroupID=GroupID from inserted
H|tfY@M1dV}0      update WUSU_LastOriginalData set DataValue=@DataValue,ReceiveTime=@ReceiveTime,GroupID=@GroupID
&tyT6K5W7N0          where SensorCode=@SensorCode
,U3U J)d{/p3{d3j0END

.[ t/h&tY5n8v5I0  当然这是为了获取各种设备最新的一条数据,如果要获取最新的两条数据,最多也就是100条记录,一次类推,只需要把上边的触发器修改一下就可以。51Testing软件测试网.JA6Z@O\&_

51Testing软件测试网:wj7QlE"?L#@

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

r/m| q)y3\5c*T0

:Tg7TvY&\:M0  有人提供了使用关联子查询的方式,确实比group by好多了,但当数据量大时,十天的数据,依然会很慢,大约20多秒。51Testing软件测试网TdI+a%a5^is

n0p:V Gn/G-a0

#`N [#C0{j0 select * from WUSU_SUOLITest_Table as t 51Testing软件测试网uS5v;v#p-k
where id  = (select max(id) from WUSU_SUOLITest_Table where SensorCode=t.SensorCode )

TAG:

 

评分:0

我来说两句

Open Toolbar