Materialized Views Quick Start Guide
Materialized Views Quick Start Guide
Time to Complete: 5 minutes Prerequisites: Rust 1.75+, HeliosDB installed Last Updated: January 4, 2026
Overview
This guide helps you create and use materialized views in HeliosDB in just 5 minutes.
Step 1: Add Dependency
Add the compute crate to your Cargo.toml:
[dependencies]heliosdb-compute = "5.0.0"tokio = { version = "1.0", features = ["full"] }Step 2: Create a Materialized View
use heliosdb_compute::materialized_views::*;
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // Create view manager let manager = MaterializedViewManager::new();
// Define a materialized view let view = MaterializedView::new( "order_summary".to_string(), r#" SELECT customer_id, COUNT(*) as order_count, SUM(total) as total_spent FROM orders GROUP BY customer_id "#.to_string(), RefreshStrategy::Manual, );
// Create the view let view_id = manager.create_view(view).await?; println!("Created view with ID: {}", view_id);
// Refresh the view manager.refresh_view(view_id).await?; println!("View refreshed successfully");
Ok(())}Step 3: Query the Materialized View
// Queries against 'order_summary' are now fast!let results = execute_query("SELECT * FROM order_summary WHERE total_spent > 1000").await?;Step 4: Set Up Automatic Refresh
use heliosdb_compute::materialized_views::*;
// Create a view with scheduled refresh (every 5 minutes)let schedule = RefreshSchedule { schedule_type: ScheduleType::Interval { seconds: 300 }, enabled: true, start_time: None, end_time: None,};
let view = MaterializedView::new( "realtime_summary".to_string(), "SELECT status, COUNT(*) FROM orders GROUP BY status".to_string(), RefreshStrategy::Scheduled(schedule),);
let view_id = manager.create_view(view).await?;println!("Auto-refresh view created");Step 5: Monitor Your View
let view = manager.get_view(view_id).await?;
println!("View Statistics:");println!(" Row count: {}", view.statistics.row_count);println!(" Last refresh: {}", view.statistics.last_refresh_time);println!(" Query hits: {}", view.statistics.query_hit_count);Common Refresh Strategies
// Manual - refresh on demandRefreshStrategy::Manual
// On-Commit - refresh after each transactionRefreshStrategy::OnCommit
// Every 5 minutesRefreshStrategy::Scheduled(RefreshSchedule { schedule_type: ScheduleType::Interval { seconds: 300 }, ..Default::default()})
// Daily at midnightRefreshStrategy::Scheduled(RefreshSchedule { schedule_type: ScheduleType::Cron { expression: "0 0 * * *".to_string(), }, ..Default::default()})What’s Next?
| Topic | Guide |
|---|---|
| Complete documentation | USER_GUIDE.md |
| Common issues | TROUBLESHOOTING.md |
| Technical details | MATERIALIZED_VIEWS_IMPLEMENTATION.md |
Quick Troubleshooting
Issue: View not being used by queries
// Check if view is fresh and activelet view = manager.get_view(view_id).await?;println!("State: {:?}", view.state);println!("Is fresh: {}", view.is_fresh());Issue: Slow refresh
// Use incremental refresh for large viewslet engine = IncrementalRefreshEngine::new();let delta = engine.compute_delta(view_id, &tables, view_size).await?;engine.apply_delta(&delta).await?;See Also: README.md | USER_GUIDE.md