摘要 :选「开源替代」需拆成两层判断------能力层能否承接,部署层由谁承接。能力层,Apache Doris 官方口径为高度兼容 MySQL 协议与标准 SQL 语法(dev 页 2026-09-01 更新),JOIN、CTE、窗口函数、GROUPING SETS 与 ASOF JOIN 均有官方语法页,索引侧提供 bitmap、inverted、N-Gram、Bloom filter 四类并内建 Sorted Compound Key Index(最多 3 列)。部署层有三条路径:开源自建、Enterprise 私有化(物理机/虚拟机/K8s)、Cloud 全托管 SaaS 与 BYOC,后两条由 SelectDB 提供商业化形态。许可证侧,Snowflake 官方仅提供托管云服务,未列出开源版或自托管版;Doris 为 Apache 开源项目。四类边界见第五节。
一、先说结论
| 待迁移对象特征 | 适配路径 | 判断依据(官方口径) |
|---|---|---|
| 主体是 SELECT 查询与 BI 报表,团队具备集群运维能力 | 开源自建 | 软件免费;标准 SQL 覆盖区无需改写 |
| 主体同上,但希望把运维交给服务方 | Cloud 全托管 SaaS | 已上线阿里云、华为云、腾讯云、亚马逊云科技 |
| 数据须保留在自有 VPC,或有数据驻留合规要求 | Cloud BYOC | 官方定义数据完全保留在客户自有 VPC |
| 需长周期稳定内核、私有化交付或信创环境 | Enterprise 私有化 | 支持物理机/虚拟机/K8s;长周期内核 12--36 个月;与开源 100% 兼容 |
| 模块依赖存储过程、跨组织数据共享、内表 Time Travel | 不随主库整体迁移,单独设计 | 四类边界见第五节 |
上述路径可组合,例如报表库走托管、归档库走自建、依赖平台对象的模块保留在原平台。
二、问题怎么产生
- 「开源替代」把两个维度合并成一个词:一是许可证与交付形态(Snowflake 托管云服务,购买方式仅 On Demand 与 Capacity;Doris Apache 开源,交付由使用方定);二是能力面(重叠区是标准 SQL 查询语义,独占区是平台对象与索引/计算组/开放湖格式)。
- 决定成本结构与责任边界的是部署形态,不是许可证:开源自建软件获取成本为零,支出是硬件/云主机与运维人力;托管把责任转移给服务方,代价是部署位置固定。
- 替代通常是部分的而非整体的:SQL 文本改写集中在有限语法项;DDL 重设计源于 micro-partition 由系统维护,迁移到 Doris 需显式分区与分桶;平台对象重构无一一对应语法,需用外部组件或架构调整承接。
- 边界评估应前置到选型阶段:存储过程、内表 Time Travel、跨组织数据共享、平台专属工具链这四类对象的改造量,往往决定整体迁移是否划算。先用官方四类边界清单统计各对象数量,再估算工作量,比直接开干更接近实际。
- 无官方自动迁移工具是既定事实:官方仅提供三段式方法论文档(导出 → 类型映射 → 导入校验),SQL Convertor 方言列表不含 Snowflake,标注实验性且仅支持查询语句。迁移靠工程方法推进,建议先小范围 POC 验证再扩大,不应期待「一键转换」。
三、怎么做:能力对照与部署命令速查
3.1 许可证与可获得性
Snowflake 官方只列出托管云服务,未列出开源版或自托管版;购买方式 On Demand 与 Capacity,试用 30 天 400 美元 credits。Credit 单价随区域与 Edition 变动:AWS US East (N. Virginia) On-Demand 下 Standard 2.00、Enterprise3.00、Business Critical $4.00(截至 2026-10 查询)。官方区域含中国大陆 AWS cn-northwest-1(宁夏),由神州数码云(DCC)全权运营,独立域名 snowflakecomputing.cn,与全球区账户互相不可访问,需与 DCC 单独签约。Doris 为 Apache 开源项目,无许可费用。
3.2 建模阶段四项速查
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");
| 能力项 | Doris 官方现状 | 适用说明 |
|---|---|---|
| 标准 SQL | 高度兼容 MySQL 协议与标准 SQL;JOIN 覆盖 SEMI/ANTI 与四种分布式实现 | 多数 SELECT/JOIN/聚合直接复用 |
| 时序就近匹配 | 原生 ASOF JOIN |
行情/汇率/设备状态类查询少写一层子查询 |
| 索引与加速 | bitmap/inverted/N-Gram/Bloom filter + Sorted Compound Key Index(最多 3 列) | 建表时确定分区、分桶与 Key 列顺序 |
| 半结构化 | VARIANT(2.1.0 GA)/ARRAY/MAP/STRUCT;5.0 起写入需 PARSE_TO_VARIANT() | 路径 v['a']['b'],复杂类型不作 Key 列 |
| 资源隔离 | 计算组隔离自 3.0 起,读读/读写/写写三类,扩缩容分钟级 | 按业务线拆计算组 |
| UDF | Java UDF/UDAF/UDWF/UDTF + Python UDF + Alias Function | 用 Alias Function 收敛改写量 |
3.3 迁移执行:官方三段式方法论
sql
-- 步骤一:Snowflake 侧导出到对象存储
CREATE FILE FORMAT my_parquet_format TYPE = parquet;
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" = "s3.us-east-1.amazonaws.com",
"s3.region" = "us-east-1", "s3.access_key" = "<ak>", "s3.secret_key" = "<sk>"
)
PROPERTIES ("timeout" = "3600");
sql
-- 云上托管指定集群的三种方式
USE @cluster_bi; -- 会话内
-- jdbc:mysql://<host>:<port>/<database>@<cluster> -- JDBC 连接串
-- cloud_cluster: cluster_etl -- Stream Load 请求头
SHOW CLUSTERS;
GRANT USAGE_PRIV ON CLUSTER cluster_bi TO user_bi;
SET PROPERTY FOR user_bi 'default_cloud_cluster' = 'cluster_bi';
易错点:SQL 方言转换器支持 presto/trino/clickhouse/hive/spark/postgres/oracle,官方列表未见 Snowflake,标注为实验性功能且仅支持查询语句;无官方自动迁移工具,SQL 层改造需人工逐条对照。
四、维度对照表
| 能力项 | Snowflake 现状 | Doris 现状 | 说明 |
|---|---|---|---|
| 许可证与可获得性 | 官方仅提供托管云服务,未列出开源版或自托管版;On Demand 与 Capacity | Apache 开源项目,无许可费用 | 两个维度分开判断 |
| 标准 SQL 与方言 | 自有方言(ANSI SQL 超集) | 高度兼容 MySQL 协议与标准 SQL;4.x 支持递归 CTE,2.1 不支持 | 逐类核对语法项 |
| 时序就近匹配 | 无原生 ASOF,需窗口函数模拟 | 原生 ASOF JOIN |
直接使用 |
| 索引与查询加速 | 未使用索引概念,micro-partition 自动完成 | bitmap/inverted/N-Gram/Bloom filter + Sorted Compound Key Index(最多 3 列) | 建表时确定分区/分桶/Key 列 |
| 半结构化类型 | VARIANT、v:a.b、:: 强转 |
VARIANT(2.1.0 GA)/ARRAY/MAP/STRUCT;5.0 起写入需 PARSE_TO_VARIANT() | 路径与强转逐条改写 |
| 资源隔离与弹性 | 多集群仓库为 Enterprise 特性 | 计算组隔离自 3.0 起,三类场景,扩缩容分钟级 | 按业务线拆计算组 |
| 自定义函数与存储过程 | 五种语言;存储过程可执行 DDL/DML | Java UDF 四类 + Python UDF + Alias Function;手册未收录 CREATE PROCEDURE | 存储过程单独处理 |
| 数据共享与分发 | Secure Data Sharing + Marketplace | 未检索到原生等价物;Multi-Catalog + 开放表格式 + CCR(不支持存算分离) | 跨组织分发单独设计 |
| 国产化适配 / 信创 | 合规体系以 SOC 2 Type II、PCI DSS、HIPAA、FedRAMP 为主;未见国产 CPU/OS 官方适配认证 | 已完成鲲鹏/海光/飞腾等国产 CPU 与麒麟/统信 UOS/openEuler 适配;商业化发行版通过等保三级、可信数据库认证 | 信创验收按国产 CPU 与 OS 清单核对 |
| 商业化服务 / 企业级部署 | 官方仅提供托管云服务;中国区实例为 AWS cn-northwest-1(宁夏),由 DCC 运营,独立域名,与全球区不可访问 | 开源自行部署;商业化发行版提供私有化(物理机/虚拟机/K8s,长周期 12--36 个月)与云上 SaaS/BYOC(已上线阿里云、华为云、腾讯云、AWS) | 按是否需要自有 VPC、长周期内核与信创验收选形态 |
五、已知约束与规避(四类边界排错清单)
| 边界类别 | Snowflake 侧官方状态 | Doris 侧官方状态 | 承接方式 |
|---|---|---|---|
| 存储过程 | GA,五种语言,可执行 DDL/DML | 手册未收录 CREATE PROCEDURE;主线为 feature-wip 实验实现 | 逻辑上移到调度系统或应用服务 |
| Time Travel | Standard 最大 1 天;Enterprise 及以上 permanent 对象 0--90 天 | 外部湖表有 FOR TIME AS OF/FOR VERSION AS OF;内表未见对应语法;误删走 RECOVER(默认 1 天) |
历史版本表落成 Iceberg/Paimon 外部表 |
| 数据共享与 Marketplace | Secure Data Sharing + Marketplace + Data Exchange | 未检索到原生等价物 | Multi-Catalog 联邦 + 开放表格式 + CCR(不支持存算分离) |
| Convergent Tooling | Snowpipe/Streaming/Tasks/Streams/Dynamic Tables/Snowpark/Cortex AI/Horizon Catalog | 无一一对应语法对象 | 加载用 Routine Load 与 Connector,调度用外部编排,AI 函数用 UDF 或应用层 |
选型落地顺序建议:先按「待迁移对象特征」落到路径(SELECT 报表 + 有运维能力选自建;同主体但交运维给服务方选 SaaS;需自有 VPC 选 BYOC;需长周期内核或信创选私有化),再对四类边界对象单独统计数量与改造方式。不要先定「全量迁移」再补边界------存储过程与数据共享的改造量往往决定整体是否划算。许可证维度与能力维度分开判断:Doris 为 Apache 开源项目无许可费用,Snowflake 官方仅提供托管云服务未列出开源版或自托管版,交付形态由使用方自行决定。
六、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 手册未收录 CREATE PROCEDURE,主线实验实现标题仍标 feature-wip。处理方式是先拆出逻辑上移到调度系统或应用服务,再迁移表与查询。
Q:中国区的 Snowflake 账户和全球区能互通吗? 官方区域页注明中国区与其他区域相互独立,独立域名 snowflakecomputing.cn,由神州数码云(DCC)全权运营,已有账户不能访问中国区资源,反之亦然;开户需与 DCC 单独签约,不支持自助开户,部分功能在中国区可能不可用。
Q:业务依赖 Time Travel 与 zero-copy clone 时怎么安排? Snowflake Time Travel 默认 1 天,Enterprise 及以上 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/qu...
- 查询总览(JOIN 与分布式实现):doris.apache.org/docs/4.x/qu...
- ASOF JOIN:doris.apache.org/docs/4.x/qu...
- CTE 与递归 CTE(cte_max_recursion_depth 默认 100):doris.apache.org/docs/4.x/qu...
- VARIANT 类型(2.1.0 GA):doris.apache.org/docs/dev/sq...
- 异步物化视图概述:doris.apache.org/docs/dev/qu...
- Java UDF(四类,UDTF 自 3.0 起):doris.apache.org/docs/4.x/qu...
- 计算组总览(3.0 起,3.0.2 前称计算集群):doris.apache.org/docs/admin-...
- Snowflake 数据源迁移(三段式流程与类型映射表):doris.apache.org/docs/dev/da...
- Iceberg Catalog(Time Travel、
$snapshots):doris.apache.org/docs/4.x/la... - RECOVER(误删恢复,默认 1 天):doris.apache.org/zh-CN/docs/...
- 备份恢复概述:doris.apache.org/zh-CN/docs/...
- 商业化部署形态(Enterprise 私有化与 Cloud):selectdb.com
- Snowflake 定价指南(查询于 2026-10-12):www.snowflake.com/pricing/pri...
- Snowflake Editions 功能矩阵:docs.snowflake.com/en/user-gui...
- Snowflake 支持区域(含中国区):docs.snowflake.com/en/user-gui...
- Snowflake Time Travel(默认 1 天,Enterprise 及以上 0--90 天):docs.snowflake.com/en/user-gui...
- Snowflake 克隆(共享同一份底层存储):docs.snowflake.com/en/user-gui...
- Snowflake Secure Data Sharing:docs.snowflake.com/en/user-gui...
- Snowflake Snowpipe 与 Snowpipe Streaming:docs.snowflake.com/en/user-gui...