Materialized views in ClickHouse help pre-aggregate and optimize query performance. Let’s integrate them with Spring Boot for faster analytics.
1. Create a Base Table
CREATE TABLE sensor_data (
device_id String,
ts DateTime,
temperature Float32,
humidity Float32
) ENGINE = MergeTree()
ORDER BY ts;
This stores raw IoT data.
2. Create a Materialized View
CREATE MATERIALIZED VIEW avg_temp_mv
ENGINE = SummingMergeTree()
ORDER BY device_id
AS SELECT device_id, avg(temperature) AS avg_temp
FROM sensor_data
GROUP BY device_id;
The view auto-updates when data is inserted.
3. Insert Data from Spring Boot
jdbcTemplate.update(
"INSERT INTO sensor_data (device_id, ts, temperature, humidity) VALUES (?,?,?,?)",
"sensor-1", LocalDateTime.now(), 24.5, 58.0
);
Data flows into the base table and materialized view.
4. Query Aggregated Data
List<Map<String,Object>> result = jdbcTemplate.queryForList(
"SELECT * FROM avg_temp_mv WHERE device_id='sensor-1'"
);
This gives instant access to pre-computed averages.
5. Expose REST API
@GetMapping("/api/avg-temp/{device}")
public Map<String,Object> getAvgTemp(@PathVariable String device) {
return jdbcTemplate.queryForMap(
"SELECT * FROM avg_temp_mv WHERE device_id=?", device
);
}
The API serves optimized query results.
image quote pre code