

这两天罗永浩怒怼西贝预制菜的事儿闹得沸沸扬扬,贾国龙急了,说西贝没有预制菜只有”预制”。网友们吵成一片,但我看到这个新闻第一反应是:西贝3分钟能上菜,我们公司一个破报表却要等2小时,这差距也太大了吧?
说实话,这事儿跟我们搞数据的关系可大了。认识我的朋友都知道,我老是拿餐厅后厨来比喻数仓,每次给新人讲数据分层我都这么说。西贝被骂预制菜,但他们的效率是真的高。
今天我就借着这个热点,跟大家聊聊为啥西贝能3分钟上菜,而你的报表却要等2小时。
先看看让人抓狂的2小时#
上个月的真事儿。周五下午4点半,马上要下班了,老板突然来了:“小王,帮我拉个数据,看看过去90天每个产品线的新老客户占比趋势。”
我去,听起来简单是吧?我当时头都大了:
-- 这是我当时写的查询
SELECT
p.product_line,
DATE(o.order_time) as order_date,
COUNT(DISTINCT CASE WHEN u.first_order_date = DATE(o.order_time)
THEN u.user_id END) as new_users,
COUNT(DISTINCT u.user_id) as total_users
FROM orders o
JOIN users u ON o.user_id = u.user_id
JOIN products p ON o.product_id = p.product_id
WHERE o.order_time >= CURRENT_DATE - INTERVAL 90 DAY
GROUP BY p.product_line, DATE(o.order_time);sql猜猜跑了多久?35分钟!
但这还不是最惨的。周一运营总监要类似的数据,又是35分钟。产品经理也要,又是35分钟。每个人都等35分钟,数据库CPU直接爆表。
那天我们的日报生成花了整整2个小时。2个小时啊!西贝上了40道菜都够了。
西贝凭啥3分钟上菜?#
其实答案贾国龙自己都说了,他们有中央厨房,食材都是”预制”好的:
传统餐厅模式:
- 客人点菜(1分钟)
- 厨师洗菜(5分钟)
- 切菜配菜(10分钟)
- 炒菜装盘(5分钟) = 总计21分钟
西贝模式:
- 凌晨4点:中央厨房洗菜切菜
- 早上6点:配好调料,真空包装
- 10点开店:所有准备就绪
- 客人点菜:加热装盘(3分钟)
看出区别了吗?把能提前做的都提前做了。这就是贾国龙说的”预制”,也是罗永浩吐槽的点。但抛开争议不谈,这不就是我们数仓的分层思想吗?
数据也能”预制”:从2小时到3分钟#
来,我给你看看怎么把2小时的报表变成3分钟:
Step 1: 原始数据提前”洗好”(ODS→DWD)#
-- 每天凌晨2点,把数据"洗干净"
CREATE TABLE dwd.order_detail AS
SELECT
order_id,
COALESCE(user_id, -1) as user_id, -- NULL值太烦人了
clean_product_id,
clean_amount,
order_time
FROM ods.orders
WHERE is_test = 0 -- 测试数据走开
AND amount BETWEEN 0 AND 999999; -- 异常值处理sql这就像西贝凌晨洗菜,把脏活累活提前干了。
Step 2: 常用维度提前”切好”(DWD→DWS)#
-- 把每天的统计提前算好
CREATE TABLE dws.product_daily_stats AS
SELECT
product_line,
stat_date,
new_user_cnt,
old_user_cnt,
total_amount
FROM (复杂的计算逻辑)
GROUP BY product_line, stat_date;
-- 这个表每天凌晨4点更新一次sql这就像西贝把菜提前切好配好,随时待命。罗永浩说这不新鲜,但效率是真的高。
Step 3: 报表数据”装盘即食”(DWS→ADS)#
-- 老板要数据?3秒搞定!
SELECT * FROM ads.product_trend_90days
WHERE product_line = '手机';
-- 0.3秒返回结果sql效果对比:数字会说话#
实施”预制”策略后,我们的数据服务发生了质变:
| 场景 | 以前(现炒现卖) | 现在(合理预制) |
|---|---|---|
| 老板要个日报 | 2-3小时 | 3-5分钟 |
| 临时查个数据 | 10-30分钟 | 秒出 |
| 数据库负载 | 经常100% | 平均30% |
| 分析师的心情 | 焦虑等待 | 从容分析 |
从2小时到3分钟,效率提升了40倍!
但是,不是所有菜都能预制#
罗永浩的吐槽也不是完全没道理。西贝自己也承认,不是所有菜都预制,有些东西必须现做。数据也一样:
必须”现炒”的数据:#
- 实时大盘:交易额、在线人数(1分钟更新)
- 异常监控:支付失败率突增(秒级响应)
- 个性化查询:每次条件都不一样
适合”预制”的数据:#
- 固定报表:日报、周报、月报
- 复杂计算:新老客、留存率、LTV
- 历史数据:去年的数据还能变?
记住一个原则:高频+复杂=必须预制。
搭建你的”数据中央厨房”#
想让报表从2小时变3分钟?按这个步骤来:
1. 先统计哪些查询最慢#
-- 找出那些拖后腿的查询
SELECT query_text, avg_duration, count(*)
FROM query_logs
WHERE duration > 60 -- 超过1分钟的
GROUP BY query_text
ORDER BY count(*) DESC;sql2. 把重复计算提前做好#
# 简单的调度脚本
def daily_prepare():
# 凌晨2点:清洗数据
run_sql("INSERT INTO dwd.order_detail...")
# 凌晨3点:聚合计算
run_sql("INSERT INTO dws.daily_stats...")
# 凌晨4点:生成报表
run_sql("INSERT INTO ads.reports...")python3. 给不同的人不同的”菜单”#
- 老板:看ADS层,都是成品,开箱即食
- 分析师:用DWS层,半成品,可以自由组合
- 工程师:查DWD层,原材料,想怎么玩怎么玩
避坑指南(都是血泪教训)#
-
别过度预制:我见过把所有可能的组合都算一遍的,结果存储爆炸,还不如不预制
-
更新要及时:预制菜放久了会坏,数据也是。该实时的别离线
-
文档要清楚:每个”预制菜”(表)都要写清楚原料(数据来源)和做法(计算逻辑)
-
监控不能少:
# 确保你的"预制菜"是新鲜的
if data_delay > 2_hours:
alert("数据延迟超2小时,检查ETL!")python写在最后#
罗永浩和西贝吵预制菜的事儿,其实给我们提了个醒:在数据世界里,合理的”预制”不是偷懒,而是效率革命。
西贝被骂了,但人家确实能3分钟上菜。你的报表还在等2小时,是不是该想想为啥了?
技术的本质就是:把重复的事情自动化,把复杂的事情简单化。
下次老板再催报表,你就可以淡定地说:“稍等,3分钟就好。“然后在心里默默感谢那些凌晨起来”预制数据”的ETL任务。