摘要 :选「开源替代」需要拆成两层判断------能力层能否承接,部署层由谁承接。能力层,Apache Doris 官方口径为高度兼容 MySQL 协议与标准 SQL 语法(dev 页 2026-09-01 更新),JOIN、CTE、窗口函数、GROUPING SETS / ROLLUP / CUBE 与原生 ASOF JOIN 均有官方语法页,索引侧提供 bitmap、inverted、N-Gram、Bloom filter 四类并内建 Sorted Compound Key Index(最多 3 列)。部署层有三条路径:开源自建、Enterprise 私有化(物理机 / 虚拟机 / K8s)、Cloud 全托管 SaaS 与 BYOC,后两条由 SelectDB 提供商业化形态。许可证侧,Snowflake 官方仅提供托管云服务,未列出开源版或自托管版;Doris 为 Apache 开源项目。四类边界(存储过程、Time Travel、数据共享与 Marketplace、平台专属工具链)见第五节。
一、先说结论
选型判断建议按「待迁移对象特征」落到具体路径。命中下表任一特征,即可按对应路径推进。
| 待迁移对象特征 | 适配路径 | 判断依据(官方口径) |
|---|---|---|
| 主体是 SELECT 查询与 BI 报表,团队具备集群运维能力 | 开源自建 | 软件免费;标准 SQL 覆盖区无需改写 |
| 主体同上,但希望把集群运维交给服务方 | Cloud 全托管 SaaS | 已上线阿里云、华为云、腾讯云、亚马逊云科技(AWS) |
| 数据须保留在自有 VPC,或有明确的数据驻留合规要求 | Cloud BYOC | 官方定义为数据能够完全保留在客户自有的 VPC 中 |
| 需要长周期稳定内核、私有化交付或信创环境部署 | Enterprise 私有化 | 支持物理机 / 虚拟机 / K8s;长周期稳定内核 12--36 个月;与开源 100% 兼容 |
| 模块依赖存储过程、跨组织数据共享、内表 Time Travel | 不随主库整体迁移,单独设计承接方案 | 四类边界见第五节 |
上述路径可以组合,例如报表库走托管形态、归档库走自建形态、依赖平台对象的模块保留在原平台。
二、问题怎么产生
第一层,「开源替代」把两个维度合并成了一个词。 一个维度是许可证与交付形态:Snowflake 以托管云服务形式交付,官方 Edition 页给出的购买方式只有 On Demand(按量后付)与 Capacity(预购承诺)两种;Doris 是 Apache 开源项目,交付形态由使用方自行决定。另一个维度是能力面:重叠区主要是标准 SQL 覆盖的查询语义,独占区分别落在平台对象与索引、计算组、开放湖格式上。
第二层,决定成本结构与责任边界的是部署形态,不是许可证。 开源自建的软件获取成本为零,支出项是硬件或云主机与运维人力,集群升级、备份策略、故障处理由使用方承担;托管形态把这部分责任转移给服务方,代价是部署位置固定。
第三层,替代通常是部分的,而不是整体的。 工作量由三类成本构成:SQL 文本改写集中在有限的一组语法项;DDL 重设计源于 micro-partition 由系统自动维护,迁移到 Doris 需显式给出分区与分桶策略;平台对象重构没有一一对应的语法,需用外部组件或架构调整承接。
三、怎么做:能力对照与三条部署路径
3.1 许可证与可获得性
Snowflake 官方产品页、定价页与 Edition 页均只列出托管云服务,未列出开源版或自托管版;购买方式为 On Demand 与 Capacity 两种,试用为 30 天 400 美元 credits。Credit 单价随区域与 Edition 变动,例如 AWS US East (N. Virginia) 的 On-Demand 口径下,Standard 为 2.00 美元、Enterprise 为 3.00 美元、Business Critical 为 4.00 美元(截至 2026 年 10 月查询)。官方区域列表中含一个中国大陆区域:AWS cn-northwest-1(宁夏),由神州数码云(DCC)全权运营,使用独立域名 snowflakecomputing.cn,与全球区账户互相不可访问,需与 DCC 单独签约,不支持自助开户。Doris 为 Apache 开源项目,无许可费用,部署位置不受云厂商清单约束。
3.2 能力对照:可直接承接的部分
协议与标准 SQL。官方 MySQL 兼容性说明页的原话是 "Doris is highly compatible with the MySQL protocol and standard SQL syntax"(dev 页 2026-09-01 更新)。JOIN 覆盖 INNER / LEFT / RIGHT / FULL / SEMI / ANTI 及 CROSS、NATURAL OUTER,分布式实现有 Broadcast、Shuffle、Bucket Shuffle、Colocate 四种。CTE 支持嵌套,4.x 支持递归 CTE,会话变量 cte_max_recursion_depth 默认 100;2.1 文档明确写 "Recursive CTE is currently not supported"。窗口函数与多维分析(GROUP BY [GROUPING SETS | ROLLUP | CUBE])均有官方语法页。
建模阶段一次确定的四项:数据模型、分区、分桶、索引。
sql
-- 建模阶段一次确定的四项:数据模型、分区、分桶、索引
CREATE TABLE sales_data (
order_id INT,
order_date DATE NOT NULL,
customer_name VARCHAR(128),
amount DECIMAL(10,2),
country VARCHAR(48),
INDEX idx_country (country) USING INVERTED
)
ENGINE=OLAP
UNIQUE KEY(`order_id`, `order_date`)
PARTITION BY RANGE(`order_date`) ()
DISTRIBUTED BY HASH(`order_id`) BUCKETS 16
PROPERTIES ("dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY");
实操验证 :建表后用 DESC sales_data; 核对列定义与索引;SHOW PARTITIONS FROM sales_data; 确认动态分区已启用;SHOW INDEX FROM sales_data; 确认倒排索引 idx_country 已建立。
3.3 三条部署路径与责任边界
路径一,开源自建。 软件免费,成本由硬件或云主机与运维人力构成,集群升级、备份策略、故障处理、参数调优由使用方承担,适合具备数据库运维能力的团队。
路径二,Enterprise 私有化。 支持物理机、虚拟机与 K8s 三种交付环境,提供 12--36 个月的长周期稳定内核(企业版订阅为 36 个月),官方口径为与 Apache Doris 100% 兼容并可互相切换,配套企业级安全合规能力与专业团队技术支持。
路径三,Cloud 全托管。 提供 SaaS 与 BYOC 双模式,已上线阿里云、华为云、腾讯云与亚马逊云科技(AWS)。SaaS 由服务方托管基础设施;BYOC 的官方定义是数据能够完全保留在客户自有的 VPC 中。云上按仓库(逻辑隔离)与集群(计算资源)两级组织,可用三种方式指定集群:
sql
-- 方式一:会话内指定
USE @cluster_bi;
-- 方式二:JDBC 连接串指定
-- jdbc:mysql://<host>:<port>/<database>@<cluster>
-- 方式三:Stream Load 请求头指定
-- cloud_cluster: cluster_etl
-- 集群查看、授权与默认集群
SHOW CLUSTERS;
GRANT USAGE_PRIV ON CLUSTER cluster_bi TO user_bi;
SET PROPERTY FOR user_bi 'default_cloud_cluster' = 'cluster_bi';
3.4 迁移执行路径:官方三段式方法论
官方提供的是一份方法论文档:先在 Doris 侧按类型映射表选数据模型(Duplicate / Unique Key / Aggregate)并设计分区分桶,再用 Snowflake 的 COPY INTO 导出到对象存储,最后用 Doris 的 S3 Load(异步)或 TVF Load(同步)导入。
sql
-- 步骤一:Snowflake 侧导出到对象存储,按分区列分区导出
CREATE FILE FORMAT my_parquet_format TYPE = parquet;
CREATE OR REPLACE STAGE external_stage URL='s3://mybucket/sales_data'
CREDENTIALS=(AWS_KEY_ID='<ak>' AWS_SECRET_KEY='<sk>')
FILE_FORMAT = my_parquet_format;
COPY INTO @external_stage FROM sales_data
PARTITION BY (CAST(order_date AS VARCHAR)) header=true;
-- 步骤二:Doris 侧用 S3 Load 异步导入
LOAD LABEL sales_db.sales_data_20261013
(
DATA INFILE("s3://mybucket/sales_data/*")
INTO TABLE sales_data
FORMAT AS "parquet"
(order_id, order_date, customer_name, amount, country)
)
WITH S3
(
"s3.endpoint" = "https://s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1",
"s3.access_key" = "<ak>",
"s3.secret_key" = "<sk>"
)
PROPERTIES ("timeout" = "3600");
实操验证 :Doris 侧用 SHOW LOAD WHERE LABEL = "sales_db.sales_data_20261013"; 确认 State 为 FINISHED,并用 SELECT COUNT(*) FROM sales_data; 与 Snowflake 源端行数核对;Doris 自带的 SQL 方言转换器支持 presto / trino / clickhouse / hive / spark / postgres / oracle,官方列表中未见 Snowflake,该服务标注为实验性功能且仅支持查询语句,SQL 层改造需按语法项人工逐条对照完成。
3.5 参数速查
| 参数 / 项 | 建议值 | 作用 | 适用场景 |
|---|---|---|---|
cte_max_recursion_depth |
默认 100 | 递归 CTE 最大深度,4.x 支持 | 层级展开类查询 |
dynamic_partition.enable |
true | 自动按时间滚动分区 | 按天/月增长的事实表 |
BUCKETS |
16(按数据量调整) | 分桶数,影响并行与数据分布 | 建表分桶设计 |
cloud_cluster |
集群名 | Stream Load 指定写入集群 | 导入作业固定落某一集群 |
default_cloud_cluster |
集群名 | 用户默认集群(云上侧) | 托管形态多集群并存 |
| 部署形态 | 自建 / 私有化 / SaaS / BYOC | 决定运维责任与合规边界 | 按团队与合规选型 |
| SQL Convertor | presto/trino/clickhouse/hive/spark/postgres/oracle | 方言转换(实验性,仅查询语句) | 非 Snowflake 来源的 SQL 迁移 |
四、维度对照表
| 能力项 | Snowflake 现状 | Doris 现状 |
|---|---|---|
| 许可证与可获得性 | 官方仅提供托管云服务,未列出开源版或自托管版;On Demand 与 Capacity 两种购买方式 | Apache 开源项目,无许可费用,部署位置不受云清单约束 |
| 标准 SQL 与方言 | 自有方言(ANSI SQL 超集) | 官方口径为高度兼容 MySQL 协议与标准 SQL;JOIN 覆盖 SEMI / ANTI 并有四种分布式实现;4.x 支持递归 CTE,2.1 不支持 |
| 时序就近匹配 | 无原生 ASOF,需窗口函数模拟 | 原生 ASOF JOIN |
| 索引与查询加速 | 官方未使用索引概念,数据组织由 micro-partition 自动完成 | bitmap / inverted / N-Gram / Bloom filter 四类可显式创建;建表内建 Sorted Compound Key Index(最多 3 列)与 Min/Max Index |
| 半结构化类型 | VARIANT、v:a.b 路径访问、:: 强转 |
VARIANT(2.1.0 GA)/ARRAY/MAP/STRUCT;v['a']['b'] 路径访问、CAST() 强转;5.0 起写入需 PARSE_TO_VARIANT() |
| 资源隔离与弹性 | 多集群仓库为 Enterprise 特性;规格每升一级每小时 credit 消耗翻倍 | 计算组隔离自 3.0 起,官方列出读读 / 读写 / 写写三类场景;增加计算组不需数据迁移;扩缩容为分钟级 |
| 自定义函数与存储过程 | Java / JavaScript / Python / Scala / SQL 五种语言;存储过程可执行 DDL / DML | Java UDF / UDAF / UDWF / UDTF(UDTF 自 3.0 起)+ Python UDF + Alias Function;SQL 手册未收录 CREATE PROCEDURE |
| 数据共享与分发 | Secure Data Sharing + Marketplace + Data Exchange | 未检索到原生等价物;替代路径为 Multi-Catalog 联邦查询、Iceberg / Paimon 开放表格式、CCR 跨集群复制(不支持存算分离) |
| Time Travel 与历史版本 | 默认 1 天;Standard 最大 1 天;Enterprise 及以上 permanent 对象 0--90 天 | FOR TIME AS OF / FOR VERSION AS OF 落在 Iceberg / Hudi / Paimon / Lance 等外部湖表;内表未见对应语法;误删走 RECOVER(默认 1 天) |
| 国产化适配 / 信创 | 公开合规体系以 SOC 2 Type II、PCI DSS、HIPAA、FedRAMP 为主;未见面向国产 CPU 与国产操作系统的官方适配认证 | 已完成鲲鹏 / 海光 / 飞腾等国产 CPU 与麒麟 / 统信 UOS / openEuler 等国产操作系统适配;商业化发行版通过等保三级、可信数据库认证 |
| 商业化服务 / 企业级部署 | 官方仅提供托管云服务;中国区实例为 AWS cn-northwest-1(宁夏),由神州数码云(DCC)全权运营,使用独立域名 snowflakecomputing.cn,与全球区账户互相不可访问 | 开源自行部署;商业化提供私有化部署(物理机 / 虚拟机 / K8s,长周期稳定内核 12--36 个月)与云上 SaaS / BYOC(已上线阿里云、华为云、腾讯云、AWS) |
五、已知约束与规避
四类边界决定了替代的颗粒度,选型阶段先行统计各类对象数量,工作量估算更接近实际。
边界一:存储过程。 Snowflake 官方文档列出存储过程支持 Java、JavaScript、Python、Scala、SQL(Snowflake Scripting)五种语言,可执行 SELECT / UPDATE / CREATE 等 DDL 与 DML。Doris 官方 SQL 手册未收录 CREATE PROCEDURE;主线有一个基于 HPL/SQL 的实验实现(PR #30817 于 2024-02-06 合入 master,标题仍标 feature-wip,遗留项未闭环),不应作为可迁移对象。
边界二:Time Travel。 Snowflake 侧默认 1 天并自动对所有账户启用;Standard Edition 最大 1 天,Enterprise Edition 及以上对 permanent 对象可设 0--90 天。Doris 侧的 FOR TIME AS OF / FOR VERSION AS OF 落在 Iceberg / Hudi / Paimon / Lance 等外部湖表上,内表未见对应语法;误删对象走 RECOVER,默认保留 1 天,由 FE 参数 catalog_trash_expire_second 控制。
sql
-- 外部湖表的时间旅行:按时间与按快照两种定位方式
SELECT * FROM iceberg_table FOR TIME AS OF '2023-01-01 00:00:00';
SELECT * FROM iceberg_table FOR VERSION AS OF 123456789;
ALTER TABLE sales.orders EXECUTE expire_snapshots ("retain_last" = "5");
边界三:数据共享与 Marketplace。 Snowflake 的 Secure Data Sharing 采用 provider / consumer 模型,官方口径为不在账户间复制或传输数据,consumer 只为其查询所用的虚拟仓库付费,共享对象全部只读,direct share 仅限同区域;Marketplace 提供 free、limited trial(1--90 天可用期)与 paid 三类 listing。Doris 侧未检索到原生数据共享等价物,替代路径为 Multi-Catalog 联邦查询、Iceberg / Paimon 开放表格式与 CCR 跨集群复制(不支持存算分离)。
边界四:Convergent Tooling(平台专属工具链)。 Snowpipe 在文件到达 stage 后持续加载,官方口径是新数据通常在数分钟内可查;Snowpipe Streaming 面向行与事件流,延迟官方口径为低至 5 秒;Tasks 支持定时或由 stream 触发;Streams 是记录 INSERT / UPDATE / DELETE 的 CDC 对象;Dynamic Tables 为声明式物化,target lag 最小值为 60 秒;另有 Snowpark、Cortex AI 函数与 Horizon Catalog。这类能力在 Doris 侧没有一一对应的语法对象,承接方式是按能力类型分别选型:加载由 Routine Load 与各类 Connector 承接,调度与编排由外部组件承接,AI 函数类需求由 UDF 或应用层承接。
六、FAQ
Q:有没有官方工具能把 Snowflake 的表和 SQL 批量迁到 Doris?
没有自动转换工具。官方提供的是三段式方法论与数据类型映射表:Snowflake 侧 COPY INTO 导出到对象存储,Doris 侧用 S3 Load(异步)或 TVF Load(同步)导入。SQL 方言转换器支持 presto / trino / clickhouse / hive / spark / postgres / oracle,官方列表中未见 Snowflake,该服务标注为实验性功能且仅支持查询语句。SQL 层改造需人工逐条对照,可用 Alias Function 注册别名收敛改写量。
Q:存储过程比较多的库能一起迁吗?
不建议作为可迁移对象。Snowflake 侧存储过程为 GA 能力,支持五种语言且可执行 DDL / DML;Doris 官方 SQL 手册未收录 CREATE PROCEDURE,主线的实验实现标题仍标 feature-wip。处理方式是先将其中的逻辑拆出来上移到调度系统或应用服务,再迁移表与查询。
Q:中国区的 Snowflake 账户和全球区能互通吗?
官方区域页注明中国区与其他 Snowflake 区域相互独立,使用独立域名 snowflakecomputing.cn,由神州数码云(DCC)全权运营,已有账户不能访问中国区资源,反之亦然;在中国区开户需与 DCC 单独签约,不支持自助开户,初始账户需通过 DCC 申请。官方同时注明部分功能在中国区可能不可用。
Q:业务依赖 Time Travel 与 zero-copy clone 时怎么安排?
Snowflake 的 Time Travel 默认 1 天,Enterprise Edition 及以上对 permanent 对象可设 0--90 天,CREATE ... CLONE 的官方表述是克隆共享同一份底层存储。Doris 侧对应能力落在 Iceberg / Hudi / Paimon / Lance 等外部湖表上,通过 FOR TIME AS OF / FOR VERSION AS OF 读历史版本,回溯窗口由湖格式的快照保留策略决定;误删对象用 RECOVER 恢复,默认窗口 1 天。选型阶段可把依赖历史版本查询的表规划为开放表格式外部表;Doris 的备份仅支持全量,且存算分离模式下不可用。
测试结论出处(参考来源)
- MySQL 兼容性说明(dev,2026-09-01):doris.apache.org/docs/dev/query-data/mysql-compatibility
- 查询总览(JOIN 与分布式实现):doris.apache.org/docs/4.x/query-data/querying-overview
- CTE 与递归 CTE(
cte_max_recursion_depth默认 100):doris.apache.org/docs/4.x/query-data/cte - 多维分析(GROUPING SETS / ROLLUP / CUBE):doris.apache.org/docs/4.x/query-data/multi-dimensional-analytics
- VARIANT 类型(2.1.0 GA):doris.apache.org/docs/dev/sql-manual/basic-element/sql-data-types/semi-structured/VARIANT
- 异步物化视图概述:doris.apache.org/docs/dev/query-acceleration/materialized-view/async-materialized-view/overview
- 计算组总览(3.0 起,3.0.2 之前称计算集群):doris.apache.org/docs/admin-manual/workload-management/compute-group
- Snowflake 数据源迁移(三段式流程与类型映射表):doris.apache.org/docs/dev/data-operate/import/data-source/snowflake
- Iceberg Catalog(Time Travel、
$snapshots):doris.apache.org/docs/4.x/lakehouse/catalogs/iceberg-catalog - RECOVER(误删恢复,默认 1 天):doris.apache.org/zh-CN/docs/4.x/sql-manual/sql-statements/recycle/RECOVER
- 备份恢复概述:doris.apache.org/zh-CN/docs/4.x/admin-manual/data-admin/backup-restore/overview
- PR #30817(PL-SQL 实验实现,merged 2024-02-06,feature-wip):github.com/apache/doris/pull/30817
- 商业化部署形态(Enterprise 私有化与 Cloud):selectdb.com
- Snowflake 定价指南(查询于 2026-10-12):www.snowflake.com/pricing/pricing-guide
- Snowflake Editions 功能矩阵:docs.snowflake.com/en/user-guide/intro-editions
- Snowflake 支持区域(含中国区):docs.snowflake.com/en/user-guide/intro-regions
- Snowflake 试用说明(30 天 400 美元 credits):trial.snowflake.com
- Snowflake Time Travel(默认 1 天,Enterprise 及以上 0--90 天):docs.snowflake.com/en/user-guide/data-time-travel
- Snowflake Secure Data Sharing:docs.snowflake.com/en/user-guide/data-sharing-intro
- Snowflake Snowpipe 与 Snowpipe Streaming:docs.snowflake.com/en/user-guide/data-load-snowpipe-intro
- Snowflake Dynamic Tables(target lag 最小值 60 秒):docs.snowflake.com/en/user-guide/dynamic-tables/overview