如果字段已更改,则SQL插入行(高性能)

时间:2012-06-11 11:54:52

标签: sql postgresql

我的表格包含以下字段:

SENSOR_ID INTEGER, 
SENSOR_READING REAL, 
TIME_OF_READING TIMESTAMP, 
HASCHANGED BOOLEAN

每个传感器每天发射10,000次读数。我只想记录那些SENSOR_READING与上次记录的值不同的数据点。

或者,我可以记录所有内容,但只要SENSOR_READING与上次记录的值不同,就会将HASCHANGED设置为true。

实现该功能的最佳性能是什么(使用PostgreSQL,没有php逻辑)?

3 个答案:

答案 0 :(得分:2)

您应该有一个包含传感器及其当前读数的表格,以及传感器事件中的UPDATE。如果新读数不同,则使用触发器写入日志表。

答案 1 :(得分:1)

我想你必须添加一个放置最后一个值的列,然后在每个“read”中你可以对这两个列进行比较。

这是一种“纯粹的SQL”方法,但有更好的解决方案,比如回调(你讲过php所以我建议symfony和doctrine可以为你做这个,如果你必须做一些步骤,这是一个有效的方法如果值被改变或类似的东西......)

答案 2 :(得分:1)

你可以做这样的事情

insert into readings (sensor_id, sensor_reading, time_of_reading)
select 42, 1234.5678, current_timestamp
from readings
where not exists (select * 
                  from readings 
                  where sensor_reading = 1234.5678
                    and time_of_reading = (select max(time_of_reading)
                                           from readings
                                           where sensor_id = 42);

这需要将sensor_reading列编入索引,但我仍然怀疑它实际上会更快。

您无需存储haschanged属性,因为您可以在检索数据时计算该属性:

select sensor_id,
       sensor_reading,
       time_of_reading,
       lag(sensor_reading) over (partition by sensor_id order by time_of_reading) = sensor_reading as has_changed
from readings;

这假设sensor_id实际上并不唯一,否则您无法为传感器存储多个读数

进一步假设您将REAL列更改为NUMERIC列,因为使用REAL的{​​{1}}值不准确(实际上存储不准确)开始)