通常意义下在 SQL 中建一个 view,view 中语句是在 view 被查询时才执行的。Materialized view(后面简称 MV)则不同,它是在 view 所依赖的表有更新时,实时计算好结果保存下来的。这使得查询 MV 非常快。Oracle / PG / MS SQL Server 都支持 MV。MV 的一个示例:
CREATE MATERIALIZED VIEW experiments AS
SELECT
experiment_views.name,
experiment_views.variant,
COUNT(DISTINCT(experiment_views.user_id)) as unique_users,
COUNT(DISTINCT(conversions.user_id)) as unique_conversions
FROM experiment_views
LEFT JOIN conversions ON
conversions.user_id = experiment_views.user_id
AND conversions.created_at > experiment_views.created_at
GROUP BY experiment_views.name, experiment_views.variant;
Materialize 是一个实现此理念的数据库:
- 支持多种输入来源,比如 RDBMS、Kafka、文件等
- 支持用 PG 兼容的语法构建 MV
- 支持用 PG 客户端快速查询 MV 的结果