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

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

51Testing软件测试网SYQIj D#s i

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

A)ZA'I6jW0 51Testing软件测试网.z}Yl"^

51Testing软件测试网 k$}8SWjIV}

CREATE TABLE [dbo].[WUSU_SUOLITest_Table](
([al}wv3U0x+A0 [ID] [bigint] IDENTITY(1,1) NOT NULL,51Testing软件测试网 q9@S"GY/MU"uy
 [ReceiveTime] [datetime] NULL,51Testing软件测试网NA*AdkN
 [GroupID] [bigint] NOT NULL,
DvGKMff0 [DataValue] [float] NULL,
;\]Hd6o%? |(y0 [SensorCode] [char](10) NOT NULL,51Testing软件测试网tY:} BvN5m2b
)

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

Bxk-VD)c(G0

rc5}Y1wF%GKo0  每一个不同的SensorCode代表了一个设备,目前有50个设备,每30秒上报一次数据,ReceiveTime代表上报数据的时间,现在需要获取每一个设备最新一次的数据,51Testing软件测试网4M9N8TpB;i.q Be

51Testing软件测试网8EOI3\M1y

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

b S x-y_-S0

;R'w#z5?Y"G,U]0

.Y*M:EE*\*I+^ {l TZ0
select * from  WUSU_SUOLITest_Table where id in (select max(id) from  WUSU_SUOLITest_Table group by SensorCode )
51Testing软件测试网X5x!@|%y$C'h2f

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

51Testing软件测试网-`'g)T:WHE

  实在想不多到什么好的而解决方法,就只能在此表上创建一个触发器,每次插入数据时就把最新的数据放在了一个临时表,又由于临时表最多只有50条数据,速度当然就很好了。51Testing软件测试网QG2Jz%Y9b ~-Px#]

X*ob^Ic!wN Eh;]g0

XA%Y-[/S0}I:S0
create TRIGGER [dbo].[UpdateWUSU_LastOriginalDataSUOLI]51Testing软件测试网#Ra[ n;|@C4@G `3k
   ON  [dbo].[WUSU_SUOLITest_Table]51Testing软件测试网 yK ~M0?t-w
   AFTER  INSERT51Testing软件测试网(Q:_#rqPTy7f
AS
} }"DugHQ;eo v0BEGIN 
!Llac%Y0    declare @SensorCode char(10), @DataValue float ,@ReceiveTime datetime ,@GroupID bigint51Testing软件测试网i eJ6_7x+jkD
    51Testing软件测试网E.V9mYD(y2R5X
    select @SensorCode=SensorCode,@DataValue=DataValue,@ReceiveTime=ReceiveTime,@GroupID=GroupID from inserted
,t%?K8Yiz8o0      update WUSU_LastOriginalData set DataValue=@DataValue,ReceiveTime=@ReceiveTime,GroupID=@GroupID
v%g\3HW$x(Bp/p I0          where SensorCode=@SensorCode51Testing软件测试网 {tZKfk[
END

9zo8@d:ez&S%N0  当然这是为了获取各种设备最新的一条数据,如果要获取最新的两条数据,最多也就是100条记录,一次类推,只需要把上边的触发器修改一下就可以。51Testing软件测试网A?!t+kf

51Testing软件测试网q5Eq%A:Ht.\

  但还有没有更好的方式,在不修改表结构的情况下?目前还没有想到。51Testing软件测试网r.GUx)Z

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

Hh\ s0LK0 51Testing软件测试网].AT*g{5kf:t

51Testing软件测试网2l'B5l3cs

select * from WUSU_SUOLITest_Table as t
4o6OD0B K8L}9V1^^0where id  = (select max(id) from WUSU_SUOLITest_Table where SensorCode=t.SensorCode )

TAG:

 

评分:0

我来说两句

Open Toolbar