订阅更新

中间表治理

数仓建模手册 第 16 题 约 5 分钟读完

本文目录
  1. 总结
  2. 中间表泛滥:每个数仓的通病
  3. 怎么判断一张表还有没有用?
  4. 表资产分级治理
  5. 废弃表下线流程
  6. 预防中间表泛滥

总结

记忆点内容
泛滥根因tmp表不清理、旧表不下线、重复建设
判定标准查询频次 + 下游依赖 + 产出状态
分级治理核心 → 常规 → 低频 → 废弃
下线四步标记 → 通知(2周) → 软删除(30天) → 物理删除
预防措施命名约束 + 审批 + 定期巡检 + 成本归因

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

进阶 | 大数据面试 · 数仓建模系列

面试真题
你们数仓里有多少张表?有没有做过表的治理和清理?怎么判断一张表还有没有用?

中间表泛滥:每个数仓的通病

打开你们的数仓,搜一下tmp_、test_、bak_——是不是有一大堆?这些表的诞生通常是这样的:某天某个需求急,临时建了一张tmp表跑通了然后忘了删;调试SQL建了个test表存中间结果后来也没管;重构的时候旧表rename成xxx_bak,说好一周后删结果半年了还在;不同的人为了同一个需求各建了一张中间表谁也不知道谁的。

Wood的实战经验
我接手短剧出海公司数据组时,数仓里有600多张表。做完盘点发现:200多张是正经的ODS/DWD/DWS/ADS,剩下400张里有150张tmp/test表、100张是已废弃但没人敢删的旧表、50张是重复建设的。真正有价值的表只占了总数的三分之一。
这不是个例,我经历的4家公司,每一家接手时都有这个问题。中间表泛滥是数仓的「慢性病」,不致命但越拖越严重。

怎么判断一张表还有没有用?

靠猜不行,要靠数据说话。三个维度判定:

维度一:查询频次。最近30天查询次数 > 0 → 活跃表;最近30天无查询但90天内有 → 低频表需确认;最近90天无查询 → 高度疑似废弃表。大部分平台都有审计日志/查询日志,写一个SQL就能查出来。

维度二:下游依赖。这张表有没有被其他调度任务读取?有没有被报表引用?有没有被API接口调用?用数据血缘追踪下游。如果一张表既没人查也没下游依赖,大概率可以下线。

维度三:产出状态。这张表的调度任务还在跑吗?最后一次产出数据是什么时候?任务是否已经暂停或下线?任务已经停了但表还在占存储的情况非常常见。

表资产分级治理

盘点完之后,把所有表分成四类:

等级定义处置方案
核心表日常报表/接口依赖,有SLA要求重点维护,有质量监控和告警
常规表有下游使用,但不是核心链路正常维护,定期Review
低频表偶尔被查,但有保留价值降低调度优先级,考虑冷存储
废弃表90天无查询、无下游、无产出走下线流程,回收存储

废弃表下线流程

直接删太危险,要有流程:

第一步:标记(Deprecated)。给疑似废弃的表打标记,加到表注释里。比如「[DEPRECATED 2025-01-15] 原用户分析临时表,已被dws_user_wide替代。计划2025-02-15下线。」

第二步:通知(至少两周)。在团队群/文档里公告:以下XX张表标记为废弃,计划于XX日下线,如有使用请反馈。实际操作中90%不会有人反馈,但这两周缓冲期非常重要——万一有个季度跑一次的任务正好依赖这张表。

第三步:软删除(移到回收站)。不直接DROP,先改名移到回收站schema保留30天。这期间如果有人发现需要,可以快速恢复。

第四步:物理删除。30天后无人认领,执行DROP释放存储。

预防中间表泛滥

治理是治标,预防才是治本:

① 命名约束:tmp表必须带日期后缀(tmp_user_analysis_20250115),可以配置自动策略:tmp_开头且超过30天的表自动进入下线流程。

② 审批机制:在非tmp命名空间建表需要审批,避免随意建表污染正式库。

③ 定期巡检:每月跑一次表资产盘点脚本,自动输出报告——本月新增表、废弃表候选、存储Top10表、90天零查询表。

④ 成本归因:把存储成本分摊到团队/个人。当你发现自己建的tmp表每月烧了500块,就会主动清理了。

面试加分提示
这题体现的是你的数据资产管理意识,属于中高级岗位的加分项:
「我在接手数据组时做过一次全量表盘点。600多张表里有效的只有三分之一,400张是tmp表、废弃表和重复建设。我做了三件事:第一,建立表分级机制,把核心表、常规表、低频表、废弃表区分开;第二,对废弃表走标记→通知→软删除→物理删除的四步流程,两个月下线了150张表,释放了约2TB存储;第三,制定预防措施,tmp表强制带日期后缀且30天自动清理,非tmp建表需要审批。」
关键:有数字(600张/150张/2TB)+ 有流程 + 有预防。
刷题进度保存在当前浏览器