应用需要保存设备的实时数据,数据库使用Sql server 2008。
每10分钟保存一条(设备一天运行8到18个小时),目前有2千台设备在线(目标为2万台),平均每台1天70条数据。
实时数据一共19个字段:
DataTime datetime2(0)、DeviceSN varchar(20)、 data1~data16 decimal(18,2)、插入时间。
主键为 (DataTime ,DeviceSN )
已经按月将表分区,目前数据总数为3183万,索引空间:64.844 MB,数据空间7,081.938 MB。Sql Server 进程占用内存为 50M左右
查询:查询一台或多台(典型值为1~5)的某一天的数据,查询条件基于聚集索引。
declare @t datetime
set @t = '2014-6-21'
--查询多台
SELECT DataForReadTime.*
FROM PlantDevice INNER JOIN
DataForReadTime ON PlantDevice.DeviceSN = DataForReadTime.DeviceSN
WHERE (PlantDevice.PlantUid = '989a71c7-6a05-4cfe-95a9-0ee8eafdbdad') AND (DataForReadTime.DataTime > @t) AND (DataForReadTime.DataTime < @t + 1)
--查询单台
SELECT * FROM DataForReadTime
WHERE (DeviceSN = '13020G1342GB03133') AND (DataTime > @t) AND (DataTime < @t + 1)
查询当前是没问题的,0秒返回。但是查询昨天或前天第一次查询需要3秒左右。而更久以前的话需要7~10秒才能返回数据,有没有办法优化一下,查询最近30天内某一天数据的查询时间减少到3秒以内。
------解决方案--------------------
可以新增一个 日期 字段
按 日期+设备id 建索引
------解决方案--------------------
贴个慢的查询的执行计划上来看看
------解决方案--------------------
抛开改写语法,你可以看到缺少了一个索引(绿色的字),预估提升接近1倍的性能,你可以先尝试创建它。右键绿色的字选择【缺少索引xxx】那个,然后改改索引名就可以了
------解决方案--------------------
已经提示你缺少索引了
------解决方案--------------------
大表建索引要点时间,超时的话等服务器不繁忙的时候再建
------解决方案--------------------
这是设计问题了,负荷也不大,建个包含索引会提升查询效率(增加数据写入时的消耗)