数据库表结构类似如下==============================================
table device_dataid     bigint(20) primary key auto_increment
value  varchar(50) not null
time   datetime not null
valid  tinyint(1) not null
==============================================实例数据如下
==================================================
id    value    time                  valid owner
1     10       2006-07-03 08:00:00   0     1
2     5        2006-07-03 08:01:00   0     2
3     1        2006-07-03 08:02:00   0     10
4     3        2006-07-03 08:03:00   0     99
5     hello    2006-07-03 08:04:00   0     1
6     good     2006-07-03 08:05:00   0     200
7     100      2006-07-03 08:06:00   0     348     1        2006-07-03 08:08:00   0     28
9     x        2006-07-03 08:09:00   0     19
10    x        2006-07-03 08:15:00   0     250
.
.
.
================================================业务参数:
1. start_time
2. end_time
3. frequency (uint: minute)业务需求:
set valid=1 on validTime业务条件:
1. start_time <= validTime <= end_time
2. validTime = (end_time - start_time) divided by frequency我的问题
我把计算所得的时间点用 time in (,,,,,...) 拼接在一句sql语句中。我的程序运行了250个线程,每个线程为不同的owner设置valid点。当计算所得到需要设置valid的时间点很多的时候(假设计算得到4000个时间点),每一个线程的每一次次update需要将近40秒时间,而且有越来越耗时的趋势。我使用的是java,利用spring的jdbcTemplate执行最终拼接的sql。请问如何在这种情形下提高update的效率。

解决方案 »

  1.   

    用in好像效率很低,in应该也是被解析成or来执行的吧?
    而且你有4000个时间点作为条件,显然条件太多了!如果不是拼串成,而是建立临时表,然后做关联,是不是会快些??如果还不得,可以改动一下你的数据库设计了!建立冗余字段,根据更新冗余字段标记,然后根据标记来更新!
      

  2.   

    情况糟糕的时候,时间点会很多。而且,这些时间点上并不一定有数据。甚至很多时间点都没有相应的数据。我目前的解决方法是把大于start_time做为条件先从数据库里得到所有的时间点,然后在程序里和理论的时间点集合进行比对。最后找出真实存在且符合条件的点,进行sql的拼串。楼上提到的建立冗余字段的方法,能不能举例一下?谢谢。