跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

v0.1 历史归档:欢迎使用 pg_mooncake (Delta Lake)

pg_mooncake v0.1(USING columnstore + Delta Lake 存储引擎)完整历史技术文档归档。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

pg_mooncake v0.1 是第一代 PostgreSQL 列存扩展,通过 USING columnstore 表访问方法与底层的 Delta Lake + DuckDB(pg_duckdb)提供分析加速。

pg_mooncake 定位图

v0.1 版本核心特性

  1. 支持直接在 USING columnstore 表上执行事务型 INSERT、UPDATE 与 DELETE
  2. 数据以 Parquet + Delta Lake 元数据格式存储在本地磁盘或 S3 / R2 对象存储上
  3. 通过内嵌 DuckDB 提供向量化查询执行
  4. 支持普通 PostgreSQL 堆表与 USING columnstore 表之间的直接关联查询

v0.1 历史归档目录

1 - v0.1 架构说明 (Delta Lake 与 USING columnstore)

pg_mooncake v0.1 架构解析:USING columnstore 表访问方法、Parquet + Delta Lake 元数据以及 DuckDB 读写路径。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

在 pg_mooncake v0.1 中,表级事务元数据保存在 PostgreSQL 系统目录中以保证事务一致性,而列存数据本身则以 Parquet 文件与 Delta Lake 元数据形式存储在本地文件系统或云端对象存储中。

列存表作为 PostgreSQL 表访问方法(USING columnstore)暴露给用户,查询通过 pg_duckdb 路由至 DuckDB 执行。

读取路径(Read Path)

涉及 USING columnstore 表的查询由 PostgreSQL 路由至 DuckDB 执行,并在内部自动处理轻微的 SQL 语法差异转换。

v0.1 架构示意图

pg_mooncake v0.1 将 Parquet 文件元数据与列级统计信息缓存在 PostgreSQL 表(mooncake.data_files)中,并在扫描时利用统计信息实现分段跳过(Segment Elimination)。

写入路径(Write Path)

在 v0.1 中,用户直接在 USING columnstore 表上运行事务型 INSERT、UPDATE 与 DELETE。为了支持更新与删除,表扫描期间会填充由 (file_id, row_offset) 组成的隐式 row_id 列。

每次写入操作都会生成一个新的 Parquet 文件,因此 v0.1 更适合大批量写入(单批次 100,000–1,000,000 行),而不适合高频小事务写入。

本地磁盘缓存

写入时数据默认缓存在本地磁盘(mooncake.enable_local_cache = true),从而显著加速对近期写入热数据的分析查询。

2 - v0.1 快速开始

pg_mooncake v0.1 历史安装指南(Docker 容器与源码构建)。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

历史 Docker 镜像(Obsolete)

docker pull mooncakelabs/pg_mooncake
docker run --name mooncake-demo -e POSTGRES_HOST_AUTH_METHOD=trust -p 5432:5432 -d mooncakelabs/pg_mooncake
docker run -it --rm --link mooncake-demo:postgres mooncakelabs/pg_mooncake psql -h postgres -U postgres

从源码编译 v0.1

git submodule update --init --recursive
make release -j$(nproc)
make install

创建扩展

CREATE EXTENSION pg_mooncake;

3 - v0.1 Hello World (USING columnstore)

pg_mooncake v0.1 USING columnstore 表的基础操作:建表、增删改、事务回滚与关联查询。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

启用扩展

CREATE EXTENSION pg_mooncake;

创建 USING columnstore 列存表(v0.1)

CREATE TABLE user_activity (
    user_id BIGINT,
    activity_type TEXT,
    activity_timestamp TIMESTAMP,
    duration INT
) USING columnstore;

插入、更新与删除

INSERT INTO user_activity VALUES
    (1, 'login', '2024-01-01 08:00:00', 120),
    (2, 'page_view', '2024-01-01 08:05:00', 30),
    (3, 'logout', '2024-01-01 08:30:00', 60),
    (4, 'error', '2024-01-01 08:13:00', 60);

UPDATE user_activity SET duration = 180 WHERE user_id = 1;
DELETE FROM user_activity WHERE user_id = 2;

事务与回滚

BEGIN;
INSERT INTO user_activity VALUES
    (5, 'login', '2024-01-02 10:00:00', 200),
    (6, 'login', '2024-01-02 10:30:00', 90);
ROLLBACK;
SELECT * FROM user_activity;

跨表关联(JOIN)

-- 两张列存表关联
SELECT * FROM user_activity ua
JOIN user_activity ua2 ON ua.user_id = ua2.user_id;

-- 普通 Postgres 行存表与列存表关联
SELECT * FROM users JOIN user_activity ON users.user_id = user_activity.user_id;

4 - v0.1 云端对象存储配置 (mooncake.create_secret)

在 pg_mooncake v0.1 中使用 mooncake.create_secret 与 mooncake.default_bucket 配置 S3 与 Cloudflare R2 存储桶。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

当前 v0.3.0 对象存储配置方式

在 v0.2 与 v0.3.0 中,对象存储凭据通过 duckdb.secrets 表管理,不再使用 mooncake.create_secret。最新说明请参阅 Iceberg 与对象存储配置。

配置 Amazon S3 存储桶(v0.1)

SELECT mooncake.create_secret(
    '<name>', 'S3', '<key_id>', '<secret>',
    '{"REGION": "<s3-region>", "SCOPE": "s3://<bucket>"}'
);

针对 S3 Express 存储桶:

SELECT mooncake.create_secret(
    '<name>', 'S3', '<key_id>', '<secret>',
    '{"ENDPOINT": "s3express-use1-az6.us-east-1.amazonaws.com", "REGION": "us-east-1"}'
);

配置 Cloudflare R2 存储桶(v0.1)

SELECT mooncake.create_secret(
    '<name>', 'S3', '<key_id>', '<secret>',
    '{"ENDPOINT": "<ACCOUNT_ID>.r2.cloudflarestorage.com"}'
);

设置默认存储桶

ALTER DATABASE <database> SET mooncake.default_bucket = 's3://<bucket>';
SHOW mooncake.default_bucket;

S3 与 R2 参数说明

参数名 说明 是否必填
name 凭据名称 是
key_id S3 / R2 Access Key ID 是
secret S3 / R2 Secret Access Key 是
REGION S3 存储桶所在区域 是
ENDPOINT R2 或 S3 Express 自定义端点 是(R2 / S3 Express)
SCOPE 凭据生效的存储桶路径前缀(如 s3://mybucket) 否

5 - v0.1 在 Neon Postgres 上使用

在 Neon Serverless PostgreSQL 上启用 pg_mooncake v0.1 的历史配置说明。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

pg_mooncake v0.1 曾作为实验性扩展提供在 Neon 托管平台上。

在 Neon 上启用扩展(v0.1)

SET neon.allow_unstable_extensions = 'true';
CREATE EXTENSION pg_mooncake;

对象存储与计算节点要求

由于 Neon 计算节点不支持将列存文件持久化在本地磁盘,在 Neon 上使用 pg_mooncake v0.1 必须按 v0.1 对象存储配置 绑定外部 S3 或 R2 存储桶,并建议关闭 Scale-to-Zero 以保留本地缓存。

6 - v0.1 参考手册总览

pg_mooncake v0.1 DDL 语法、Delta Lake 元数据表、GUC 配置参数、数据导入与外部文件查询参考索引。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

7 - v0.1 列存表 DDL (USING columnstore)

在 pg_mooncake v0.1 中使用 USING columnstore 创建与删除列存表、支持的数据类型与约束说明。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

创建列存表(v0.1)

在 v0.1 中,列存表通过在 CREATE TABLE 时附加 USING columnstore 子句直接创建:

CREATE TABLE users_columnstore (
    id INT,
    name TEXT,
    created_at TIMESTAMP
) USING columnstore;

-- 或通过 CREATE TABLE ... AS SELECT 创建
CREATE TABLE users_columnstore USING columnstore AS
    SELECT * FROM users_rowstore;

删除列存表

DROP TABLE users_columnstore;

v0.1 支持的特性与限制

  • 支持:INSERT、UPDATE、DELETE、ACID 事务、NOT NULL 约束、默认值以及与行存表的关联查询。
  • v0.1 不支持的数据类型:ENUM、uhugeint、JSONB(早期受限)以及部分数组类型。
  • v0.1 不支持的约束:主键、外键、唯一约束、索引以及分区表(修改表结构需重建表)。

将 columnstore 设为默认表访问方法(v0.1)

SET default_table_access_method = 'columnstore';

8 - v0.1 在 Postgres 外部查询列存表

在 pg_mooncake v0.1 中查看 mooncake.columnstore_tables 与 mooncake.data_files,并通过 Python Polars 读取 Delta Lake 表。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

当前 v0.3.0 元数据查询函数

在 v0.2 与 v0.3.0 中,请使用 SELECT * FROM mooncake.list_tables(); 查看表 LSN 进度与 Apache Iceberg v2 仓库路径。

查找表物理路径(v0.1)

在 v0.1 中,mooncake.columnstore_tables 目录表记录了每张 USING columnstore 表的 Delta Lake 存储路径:

SELECT * FROM mooncake.columnstore_tables;

查看底层 Parquet 数据文件(v0.1)

SELECT * FROM mooncake.data_files;

使用 Python Polars 直接读取 v0.1 Delta Lake 表

import polars as pl

local_path = "/usr/local/pgsql/data/mooncake_local_tables/mooncake_postgres_users_columnstore_16446/"
df = pl.scan_delta(local_path)
print(df.collect())

9 - v0.1 GUC 配置参数

pg_mooncake v0.1 历史 GUC 配置变量(mooncake.default_bucket、maximum_memory、maximum_threads 等)。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

v0.1 GUC 参数一览

-- 默认对象存储桶
ALTER DATABASE <database_name> SET mooncake.default_bucket = 's3://my-bucket';

-- 分配给 DuckDB 的内存上限(v0.1.1+,默认 4GB)
ALTER DATABASE <database_name> SET mooncake.maximum_memory = '6GB';
CALL mooncake.reset_duckdb();

-- DuckDB 并行工作线程数(v0.1.1+,默认 -1 表示使用全部核心)
ALTER DATABASE <database_name> SET mooncake.maximum_threads = -1;

-- 本地磁盘写缓存(默认 true)
ALTER DATABASE <database_name> SET mooncake.enable_local_cache = false;

-- Parquet 元数据内存缓存(默认 true)
ALTER DATABASE <database_name> SET mooncake.enable_memory_metadata_cache = false;

10 - v0.1 数据导入指南

在 pg_mooncake v0.1 中从 PostgreSQL 表、Parquet/CSV/JSON 文件、Iceberg/Delta 表及 HuggingFace 导入数据。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

从 PostgreSQL 行存表导入(v0.1)

INSERT INTO users_columnstore
SELECT * FROM users_rowstore;

从 Parquet、CSV 或 JSON 文件导入(v0.1)

-- 使用 COPY 命令
COPY users_columnstore FROM 's3://bucket/file.parquet';
COPY users_columnstore FROM 's3://bucket/folder/*.parquet';
COPY users_columnstore FROM 's3://bucket/data.csv' WITH (FORMAT 'csv', HEADER true);

-- 使用 INSERT + mooncake.read_parquet
INSERT INTO users_columnstore
SELECT * FROM mooncake.read_parquet('s3://bucket/file.parquet') AS (
    id INT,
    name TEXT,
    created_at TIMESTAMP
);

从 Iceberg、Delta Lake 或 HuggingFace 导入(v0.1)

-- Iceberg
INSERT INTO users_columnstore
SELECT * FROM iceberg_scan('s3://bucket/table') AS (id INT, name TEXT, created_at TIMESTAMP);

-- Delta Lake
INSERT INTO users_columnstore
SELECT * FROM delta_scan('s3://bucket/table') AS (id INT, name TEXT, created_at TIMESTAMP);

-- HuggingFace
COPY users_columnstore FROM 'hf://datasets/OpenLeecher/lmsys_chat_1m_clean/data/train-00000-of-00004.parquet';

11 - v0.1 查询外部数据文件

在 pg_mooncake v0.1 中使用 mooncake.read_parquet、mooncake.read_csv 与 mooncake.read_json 直接查询外部数据文件。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

当前 v0.3.0 外部文件读取方式

在 v0.2 与 v0.3.0 中,请使用 duckdb.read_parquet、duckdb.read_csv、duckdb.iceberg_scan 与 duckdb.delta_scan,详见在 Postgres 中查询外部数据湖。

查询 Parquet、CSV 与 JSON 文件(v0.1)

-- Parquet
SELECT user_id, event_type, created_at
FROM mooncake.read_parquet('s3://bucket/events.parquet') AS (
    user_id INT,
    event_type TEXT,
    created_at TIMESTAMP
)
WHERE created_at > '2023-01-01';

-- CSV
SELECT r['user_id']::INT, r['event_type'], r['created_at']::TIMESTAMP
FROM mooncake.read_csv('s3://bucket/events.csv', AUTO_DETECT=TRUE) r
WHERE r['created_at']::TIMESTAMP > '2023-01-01';

-- JSON
SELECT
    json_extract_path_text(data, 'user_id')::INT AS user_id,
    json_extract_path_text(data, 'event_type') AS event_type
FROM mooncake.read_json('s3://bucket/events.json') AS (data JSONB);

查询 Iceberg 与 Delta Lake 表(v0.1)

SELECT * FROM iceberg_scan('s3://bucket/iceberg_table') AS (
    user_id INT, event_type TEXT, created_at TIMESTAMP
);

SELECT * FROM delta_scan('s3://bucket/delta_table') AS (
    user_id INT, event_type TEXT, created_at TIMESTAMP
);

12 - v0.1 支持的查询形态

pg_mooncake v0.1 中的分析型查询模式、不支持的 PostgreSQL 函数及 DuckDB 占位函数说明。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

关于 v0.3.0 与 DuckDB 2.0 的最新查询形态指南,请参阅查询列存表与查询形态。

分析聚合与时序查询(v0.1)

SELECT
    region,
    date_trunc('quarter', sale_date) AS quarter,
    SUM(amount) AS total_sales,
    COUNT(*) AS num_transactions,
    AVG(amount) AS avg_sale
FROM sales_columnstore
WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY region, quarter
ORDER BY region, quarter;

在 Postgres 中暴露 DuckDB 函数(v0.1)

CREATE OR REPLACE FUNCTION time_bucket(interval, timestamp)
RETURNS timestamp AS $$
BEGIN
    RAISE EXCEPTION 'this is a placeholder for columnstore';
END;
$$ LANGUAGE plpgsql;

13 - v0.1 数据归档方案

pg_mooncake v0.1 中将历史数据从行存表迁移至 USING columnstore 归档表的历史方案。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

当前 v0.3.0 分区冷热归档方案

在 v0.2 与 v0.3.0 中,无需再手动编写 INSERT INTO ... DELETE FROM 迁移脚本,只需对分区表调用 CALL mooncake.create_table 并直接 DROP 旧分区即可。详见大表分区冷热归档。

v0.1 数据归档方式

-- 创建列存归档表
CREATE TABLE orders_archive (
    order_id INT,
    customer_id INT,
    order_date TIMESTAMP,
    amount NUMERIC(10, 2)
) USING columnstore;

-- 将历史数据拷贝至列存归档表
INSERT INTO orders_archive
SELECT * FROM orders
WHERE order_date < CURRENT_DATE - INTERVAL '1 year';

-- 从源表删除历史数据并回收空间
DELETE FROM orders
WHERE order_date < CURRENT_DATE - INTERVAL '1 year';
VACUUM FULL orders;

14 - v0.1 操作型分析(触发器 + pg_cron 暂存表方案)

在 Moonlink 推出之前,pg_mooncake v0.1 使用触发器、暂存表与 pg_cron 定时批处理实现准实时分析的历史方案。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

在 v0.2 / v0.3.0 中已由 mooncake.create_table 彻底取代

在 v0.1 中,将行存表同步至 USING columnstore 表需要手动维护触发器、暂存表与 pg_cron 定时任务。在 v0.2 与 v0.3.0 中,只需一行 CALL mooncake.create_table('orders_analytics', 'orders'); 即可实现亚秒级逻辑复制。详见实时操作分析 (HTAP)。

v0.1 历史暂存表与触发器同步模式

-- 1. 创建暂存表
CREATE TABLE orders_staging (
    order_id INT PRIMARY KEY,
    customer_id INT,
    quantity INT,
    unit_price DECIMAL(10, 2),
    order_date TIMESTAMP
);

-- 2. 创建列存表
CREATE TABLE orders_analytics (
    order_id INT,
    customer_id INT,
    quantity INT,
    unit_price DECIMAL(10, 2),
    order_date TIMESTAMP,
    last_updated TIMESTAMP
) USING columnstore;

-- 3. 通过 pg_cron 定期将暂存表批量写入列存表
CREATE OR REPLACE FUNCTION sync_to_columnstore() RETURNS void AS $$
BEGIN
    INSERT INTO orders_analytics
    SELECT s.*, NOW() FROM orders_staging s;
    TRUNCATE orders_staging;
END;
$$ LANGUAGE plpgsql;

15 - v0.1 数据仓库与 dbt 集成

pg_mooncake v0.1 每日聚合流水线与通过 default_table_access_method = ‘columnstore’ 集成 dbt 的历史指南。
pg_mooncake v0.1 历史归档文档(Delta Lake 引擎)

本页归档的是早期 pg_mooncake v0.1 版本文档(采用直接 CREATE TABLE ... USING columnstore DDL 与 Delta Lake 存储)。从 v0.2 及 PGSTY 维护的 v0.3.0 版本起,pg_mooncake 已全面转向基于 moonlink 的实时列存镜像架构(CALL mooncake.create_table + USING mooncake)与 Apache Iceberg v2。最新文档请参阅简介与 v0.1 与 v0.2 / v0.3 架构演进对比。

每日聚合数仓流水线(v0.1)

CREATE TABLE daily_sales_summary (
    date DATE,
    product_id INT,
    category_id INT,
    region_id INT,
    total_quantity INT,
    total_revenue DECIMAL(18, 2)
) USING columnstore;

与 dbt 集成(v0.1)

在 v0.1 中,可以通过在 dbt 的 on-run-start 钩子中设置 default_table_access_method = 'columnstore' 让 dbt 模型默认创建列存表:

{% macro on_run_start() %}
  {% set query %}
    SET default_table_access_method = 'columnstore';
  {% endset %}
  {% do run_query(query) %}
{% endmacro %}