大数据量下的查找最新的几条数据的通用方法
上一篇 /
下一篇 2012-09-10 09:15:58
/ 个人分类:数据库
51Testing软件测试网4@[(E8a"W@ 由于项目需要,需要获取一组数据的的最新一条数据,表结构如下:51Testing软件测试网-H7ycN8f2~8K$x;D
_9bkVH@{%\i6j0
51Testing软件测试网 AGy0S+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(uoE@6|0 每一个不同的SensorCode代表了一个设备,目前有50个设备,每30秒上报一次数据,ReceiveTime代表上报数据的时间,现在需要获取每一个设备最新一次的数据,
9X-k1xv@
uJ(|"_f/l0
51Testing软件测试网{*{D'[On;N*h-e*Q 开始我使用如下的查询语句:
%Gw+]5{'U$Z"J0
A,Rnk)F/v y0
)~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条数据,速度当然就很好了。
)z6O9ip9wc0Ya0
51Testing软件测试网7k2n0_@,YPa w
51Testing软件测试网/sZ*h:[Lk
create TRIGGER [dbo].[UpdateWUSU_LastOriginalDataSUOLI]51Testing软件测试网DpJ^)U2z#a ON [dbo].[WUSU_SUOLITest_Table]51Testing软件测试网%Sjw.Y[L AFTER INSERT !V{wC)O9H0AS 51Testing软件测试网x/z0?JD{ BEGIN u U-j:Sx|9F0 declare @SensorCode char(10), @DataValue float ,@ReceiveTime datetime ,@GroupID bigint B*J/w#by,K x0 51Testing软件测试网'xJcuLq,[ 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软件测试网:w j7QlE"?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: