拾穗数据

Back

数据仪表盘与分析数据仪表盘与分析

这两天罗永浩怒怼西贝预制菜的事儿闹得沸沸扬扬,贾国龙急了,说西贝没有预制菜只有”预制”。网友们吵成一片,但我看到这个新闻第一反应是:西贝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. 客人点菜(1分钟)
  2. 厨师洗菜(5分钟)
  3. 切菜配菜(10分钟)
  4. 炒菜装盘(5分钟) = 总计21分钟

西贝模式:

  1. 凌晨4点:中央厨房洗菜切菜
  2. 早上6点:配好调料,真空包装
  3. 10点开店:所有准备就绪
  4. 客人点菜:加热装盘(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;
sql

2. 把重复计算提前做好#

# 简单的调度脚本
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...")
python

3. 给不同的人不同的”菜单”#

  • 老板:看ADS层,都是成品,开箱即食
  • 分析师:用DWS层,半成品,可以自由组合
  • 工程师:查DWD层,原材料,想怎么玩怎么玩

避坑指南(都是血泪教训)#

  1. 别过度预制:我见过把所有可能的组合都算一遍的,结果存储爆炸,还不如不预制

  2. 更新要及时:预制菜放久了会坏,数据也是。该实时的别离线

  3. 文档要清楚:每个”预制菜”(表)都要写清楚原料(数据来源)和做法(计算逻辑)

  4. 监控不能少:

# 确保你的"预制菜"是新鲜的
if data_delay > 2_hours:
    alert("数据延迟超2小时,检查ETL!")
python

写在最后#

罗永浩和西贝吵预制菜的事儿,其实给我们提了个醒:在数据世界里,合理的”预制”不是偷懒,而是效率革命。

西贝被骂了,但人家确实能3分钟上菜。你的报表还在等2小时,是不是该想想为啥了?

技术的本质就是:把重复的事情自动化,把复杂的事情简单化。

下次老板再催报表,你就可以淡定地说:“稍等,3分钟就好。“然后在心里默默感谢那些凌晨起来”预制数据”的ETL任务。

为什么西贝3分钟能上菜,你的报表却要等2小时?
https://blog.ss-data.cc/blog/xibei-3-minutes-vs-2-hours-report
Author 石头
Published at 2025年9月29日
Comment seems to stuck. Try to refresh?✨