云数仓月度账单总是超预算:Apache Doris 与 Snowflake 五类成本项拆解与对账脚本

摘要:做次年预算时按"每小时单价 × 运行小时数"估出月成本 8 万,年底对账变成 23 万。差的不是单价,是成本项没列全------存储按 Active/Time Travel/Fail-safe 三种状态一起算、云服务层超出当日仓库用量 10% 的部分另计、数据出向按三档费率收、Serverless 功能按 compute-hours 单独计量。这篇按官方公开口径(定价数字均为 AWS US East (N. Virginia)、On-Demand、截至 2026 年 10 月查询)把五类成本项拆成可代入的清单,给折算脚本、官方查询视图与自建侧的盘点语句。另一侧账本结构不同,Apache Doris 侧的成本分摊在节点规格、副本数与对象存储上。两侧计量对象不同构,本文不给"谁更便宜"的算术结论,只给固定月预算后比负载量的折算方法。

一、先说结论

先把五类成本项摆成一列,再逐项填数,账单预估才不会偏乐观:

成本项 计量单位 官方口径要点
计算 credit Standard 2.00/Enterprise2.00 / Enterprise 2.00/Enterprise3.00 / Business Critical 4.00(AWSUSEast,On−Demand);东京4.00(AWS US East,On-Demand);东京 4.00(AWSUSEast,On−Demand);东京2.85、伦敦 2.70、圣保罗2.70、圣保罗 2.70、圣保罗3.10(Standard 档)
存储 $23.00 / TB / 月 按压缩后月均字节计,Active、Time Travel、Fail-safe 三态都算
云服务层 超 10% 部分 当日云服务用量超过当日虚拟仓库用量 10% 才计费,按 UTC 逐日
数据传输 0.00/0.00 / 0.00/20.00 / $90.00 每 TB 入向不收费;同区域、同云跨区、跨云出公网三档
Serverless 功能 compute-hours 逐秒计量并向上取整到整秒,各功能 credits/compute-hour 不同

自建形态的账本在另外三个变量上:节点规格与数量、数据副本数、存储介质。存算一体默认三副本,存算分离下数据只需一份,官方 3.0 Release Notes 口径是"相比存算一体三副本,存储成本可降低最高 90%"。开源侧软件本身免费,成本来自硬件或云主机加人力。

二、问题怎么产生:账单是在哪几步被低估的

2.1 只统计了虚拟仓库这一项

预估时最容易拿"每小时多少钱"乘以运行小时数,得出的数只覆盖计算层。账单里还有存储、云服务层超 10% 部分、数据传输出向、Serverless 功能四项,其中存储三项状态的数据加总后往往接近计算项的量级。漏掉的四项不出现在任何查询统计里,容量规划阶段最容易被跳过。

2.2 credit 单价不是一个数

credit 单价按 Edition 与区域同时浮动:Standard 2.00、Enterprise2.00、Enterprise 2.00、Enterprise3.00、Business Critical 4.00(AWSUSEast,On−Demand),东京4.00(AWS US East,On-Demand),东京 4.00(AWSUSEast,On−Demand),东京2.85、伦敦 2.70、圣保罗2.70、圣保罗 2.70、圣保罗3.10(Standard 档)------区域选错,单价差出 55%。此外按量模型下成本不由查询量决定,而由资源处于可用状态多久决定:每次启动或恢复先按 60 秒最小计费,扩缩容同样触发,一分钟内反复 suspend 加 resume 会多次触发。

2.3 存储算的是历史总量

计费的不是"当前有多少数据",而是含历史状态与故障保护期的总量。Time Travel 默认 1 天,Standard Edition 最大 1 天,Enterprise 及以上对永久对象可设 0 至 90 天;永久表在 Time Travel 结束后进入 Fail-safe,持续 7 天。保留期从 1 天调成 90 天,账单差一个量级,而这个调整往往发生在某次运维操作里,没人记账。

三、怎么做:五类成本项的折算与盘点

3.1 怎么列项:把每类消耗单独成行

可行做法是把每类消耗单独列项、按官方规则折算后再相加,而不是找一个综合单价去乘。下面按计算、存储、云服务层、数据传输、Serverless 的顺序逐项给口径与语句,最后给出自建侧的盘点方法。

3.2 怎么算计算:规格表 + 折算脚本

仓库规格决定每小时消耗多少 credit。官方 Gen1 标准仓库十档,每升一级消耗翻倍:

仓库规格 Credits / hour 规格 Credits / hour
X-Small 1 2X-Large 32
Small 2 3X-Large 64
Medium 4 4X-Large 128
Large 8 5X-Large 256
X-Large 16 6X-Large 512

官方 X-Small 示例:10 分钟 0.167 credits,1 小时 1.000 credits。把规格、单价与运行时长写成框架:

python 复制代码
# 月账单折算框架:参数口径 AWS US East (N. Virginia),On-Demand,截至 2026-10-12 查询
CREDIT_PRICE = {"Standard": 2.00, "Enterprise": 3.00, "Business Critical": 4.00}
WAREHOUSE_CREDITS_PER_HOUR = {
    "X-Small": 1, "Small": 2, "Medium": 4, "Large": 8, "X-Large": 16,
    "2X-Large": 32, "3X-Large": 64, "4X-Large": 128,
}

def monthly_cost(edition, wh_size, running_hours, storage_tb, egress_tb=0.0, egress_rate=20.00):
    """running_hours 填月度累计运行小时;egress_rate 同云跨区域 20.00,跨云或出公网 90.00"""
    compute = WAREHOUSE_CREDITS_PER_HOUR[wh_size] * running_hours * CREDIT_PRICE[edition]
    storage = storage_tb * 23.00                      # $23.00 / TB / 月,按压缩后月均字节
    egress = egress_tb * egress_rate
    return {"compute": round(compute, 2), "storage": round(storage, 2),
            "egress": round(egress, 2), "total": round(compute + storage + egress, 2)}

# 验:X-Small / Standard 跑 200 小时、存储 20TB、跨区出向 2TB
print(monthly_cost("Standard", "X-Small", 200, 20, 2))

框架刻意没有包含云服务层与 Serverless 两项:它们不按小时线性累加,见 3.4 与 3.5。

3.3 怎么查存储:三态占用与保留期

判断这一项有多大,官方视图可以直接查:

sql 复制代码
-- 三态存储分列统计(视图:SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS)
SELECT
    TABLE_NAME,
    ROUND(ACTIVE_BYTES / POWER(1024, 4), 3)              AS active_tb,
    ROUND(TIME_TRAVEL_BYTES / POWER(1024, 4), 3)         AS time_travel_tb,
    ROUND(FAILSAFE_BYTES / POWER(1024, 4), 3)            AS failsafe_tb,
    ROUND(RETAINED_FOR_CLONE_BYTES / POWER(1024, 4), 3)  AS retained_for_clone_tb
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS
WHERE TABLE_SCHEMA = 'PUBLIC'
ORDER BY (ACTIVE_BYTES + TIME_TRAVEL_BYTES + FAILSAFE_BYTES) DESC
LIMIT 20;

若 time_travel_tb 与 failsafe_tb 之和接近 active_tb,说明保留期策略已实质影响账单,缩短保留期是最直接的调整手段。零拷贝克隆的引用存储由 RETAINED_FOR_CLONE_BYTES 单独统计,任一方发生 DML 后会生成独占新分区并纳入计费。保留期相关的设置与查看方式:

sql 复制代码
-- 对象级保留期:Standard 最大 1 天;Enterprise 及以上永久对象可设 0--90 天
ALTER TABLE prod.orders SET DATA_RETENTION_TIME_IN_DAYS = 1;
-- 有效保留期 = MAX(对象级 DATA_RETENTION_TIME_IN_DAYS, 账户级 MIN_DATA_RETENTION_TIME_IN_DAYS)
SHOW PARAMETERS LIKE 'MIN_DATA_RETENTION_TIME_IN_DAYS' IN ACCOUNT;

3.4 怎么算云服务层、出向与 Serverless

云服务层承担鉴权、元数据与查询编译,仅当当日云服务用量超过当日虚拟仓库用量的 10% 才计费,按 UTC 逐日计算------大量小查询、频繁元数据操作的负载更容易触发,少量大查询基本不会。

数据传输入向不收费,出向分三档:同云同区域 0.00,同云跨区域0.00,同云跨区域 0.00,同云跨区域20.00/TB,跨云或出公网 $90.00/TB(AWS 口径,源区域 US East);Azure 与 GCP 档位值不同。跨区域协作与对外供数是主要来源,架构设计阶段确定数据落区域比事后优化有效。

Snowpipe、Tasks 的 serverless 模式、物化视图维护等由 Snowflake 托管资源执行的功能,按 compute-hours 计费,逐秒计量并向上取整到整秒。Snowpipe 按加载数据量收固定 credits/GB,文本文件按未压缩大小计,Parquet 等二进制文件按存储实测大小计。

3.5 怎么盘自建侧:节点、副本与云上三项

自建形态下软件本身免费,成本来自节点规格与数量、数据副本数、存储介质三部分。存算分离下增加计算组不需要迁移数据,同一份数据可由多个计算组访问;云上多集群同理:

sql 复制代码
-- 云上多集群:数据共享 + 计算隔离,不同业务指向不同集群
USE @online_cluster;
-- 回落到默认集群后再做批量写入,读写互不抢占
USE @offline_cluster;
SHOW CLUSTERS;

-- 自建形态:建一张探测表确认副本数与存储占用
CREATE TABLE cost_probe (
    id      BIGINT       NOT NULL,
    dt      DATE         NOT NULL,
    amount  DECIMAL(18,2) NULL
) DUPLICATE KEY(id)
PARTITION BY RANGE(dt) (
    PARTITION p202610 VALUES LESS THAN ('2026-11-01'),
    PARTITION p202611 VALUES LESS THAN ('2026-12-01')
)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES ("replication_num" = "3");

云上形态把计算、存储、缓存三项独立计费,按量秒精度计量,集群暂停后计算停止计量而缓存继续计量,换算月成本时三项需分别代入各自使用量。盘点自建形态的成本基数:

sql 复制代码
SHOW BACKENDS;   -- 节点数、单节点磁盘容量与存活状态
SHOW DATA;       -- 各库表数据量与副本数,副本数直接放大存储占用

3.6 怎么对账:月末三步核对

第一步,用折算脚本的输出与实际账单逐项比对,差异超过两成就去查漏项;第二步,跑三态存储视图,确认保留期策略有没有把历史版本堆成新的存储大头;第三步,核对出向流量落在哪一档费率上,跨区协作与对外供数是出向费用的两个主要来源。三步走完再把口径写进下次预算模板,比事后追着账单查高效得多。

四、维度对照表

成本项 Apache Doris Snowflake
计算计量单位 开源侧按节点规格;云上按 vCPU 时长 credit(Standard 2.00/Enterprise2.00 / Enterprise 2.00/Enterprise3.00 / Business Critical $4.00,AWS US East,On-Demand)
最小计费 开源侧无计量;云上按量秒精度计量、小时出账 60 秒最小计费,启动/恢复/扩容各触发一次
存储单价 对象存储按量;自建按磁盘容量 $23.00 / TB / 月,按压缩后月均字节计
存储副本 存算一体默认三副本;存算分离一份(官方口径最高降 90%) 由平台托管,不对外暴露副本数
历史数据 备份快照与回收站按配置保留 Active / Time Travel / Fail-safe 三态均计费,Fail-safe 7 天
缓存 云上缓存独立计量,集群暂停后仍计费 无独立缓存计费项
数据出区 自建无出区费;云上跨区由云厂商计费 同区域 0.00;跨区域0.00;跨区域 0.00;跨区域20.00/TB;跨云或出公网 $90.00/TB
托管功能 由自建团队或云上计算资源承担 Serverless 按 compute-hours 逐秒计量
国产化适配 / 信创 已适配鲲鹏/海光/飞腾 CPU 与麒麟/统信 UOS/openEuler,通过等保三级与可信数据库认证 未纳入信创目录,无官方信创认证
商业化服务 / 企业级部署 开源自建;商业化由 SelectDB 提供私有化部署、云上 SaaS/BYOC、多云原生与国产化适配(信创),与开源 100% 兼容 官方仅提供托管云服务,未列出开源版或自托管版

五、已知约束与规避

上表 Snowflake 数字均为 AWS US East (N. Virginia)、On-Demand 口径,查询时间 2026 年 10 月。换区域、换 Edition、改用 Capacity 预购,单价都不同;Capacity 折扣区间官方未公开,需向销售询价。

Gen2 仓库费率未核实:官方文档记载新建标准仓库默认使用 Gen2(所在区域不支持时除外),但 credits/hour 不在仓库页列出,官方指向 Service Consumption Table,做预算时按 Gen1 规格表估算并注明口径。

中国大陆区定价未公开:官方区域列表包含 AWS cn-northwest-1(宁夏),由神州数码云运营,使用独立域名且与全球区账户隔离;该区域未进入定价页的区域选择器,单价需另行询价。

不要做单价除法:credit 打包编排与元数据服务,节点规格只含机器成本,两者计量对象不同,可行的比较方式是固定月预算再看各自能完成的负载量与响应水平。

六、FAQ

Q1:折算脚本里的 running_hours 怎么填才准? 不要用业务时段估算,用实际运行时长。官方明确挂起时不消耗 credit,但从启动起有一分钟最小计费,建议设一个固定的自动挂起周期,跑满一个自然月后从账单或用量视图反推累计运行小时,再代入脚本。

Q2:仓库规格从哪一档起步? 按负载形态定,规格每升一级每小时消耗翻倍(X-Small 1 到 6X-Large 512)。扫描型大结果集负载偏向升规格换取单次更快;大量小查询的负载升规格收益有限,还可能因频繁元数据操作触发云服务层计费。先用 X-Small 跑一轮基线再逐级试。

Q3:出向费用主要来自哪里,怎么压? 来自跨区域协作与对外供数。入向不收费,同云同区域 0.00,同云跨区域0.00,同云跨区域 0.00,同云跨区域20.00/TB,跨云或出公网 $90.00/TB(AWS 口径),架构设计阶段确定数据落区域比事后优化有效。

Q4:自建形态想从三副本改成一份,怎么操作? 走存算分离形态,数据落在共享存储上只需一份,官方 3.0 Release Notes 口径是"相比存算一体三副本,存储成本可降低最高 90%"。改之前用 SHOW DATA 看各库表数据量与副本数,历史数据占比高的负载收益最明显。

Q5:Gen2 仓库的 credits/hour 在哪查? 官方未把 Gen2 的 credits/hour 列在仓库页,指向 Service Consumption Table。做预算时按 Gen1 规格表估算并注明口径,或以实际账单反推。

相关推荐
迪菲赫尔曼1 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测
2601_962885721 小时前
2026 Python 股票数据接口选型指南(横评 + 决策树)
开发语言·python·区块链
龙腾AI白云2 小时前
大模型检索增强生成(RAG)的技术原理与架构设计
数据库·python·机器学习·知识图谱
fanruitian2 小时前
python 可视化 panda seaborn matplotlib.pyplot
开发语言·python·matplotlib
梦想不只是梦与想2 小时前
Python 中的 json 模块
python·json·对象转字符串
星河耀银海2 小时前
Python文件操作:read、readline、readlines读取方式对比
python·文件操作·面向对象·基础函数·教程学习
傅科摆 _ py3 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
吴名氏.3 小时前
Java转AI Agent教程(第一周)让模型先跑起来
人工智能·python·ai·ai agent
第404号工位4 小时前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构