Tableau 数据提取刷新:全量、增量与子范围刷新详解

搞不清全量刷新、增量刷新、子范围刷新的区别?这三种方式听起来相似,背后的机制和适用场景却完全不同。本文讲清机制:数据怎么落地、刷新时动了多少数据、各自补不了哪块短板。

本文是「机制原理篇」,讲清楚三种刷新方式在做什么。如果你要的是在 Desktop 与 Server 上一步步配出来的操作手册,请看姊妹篇 《Tableau Server 服务器增量提取详解》 。

本文依据 Tableau 官方「刷新数据提取」文档撰写,覆盖 2024.1 的非唯一键列支持与 2024.2 新增的子范围刷新。

本文要点 ① 实时连接每次查库,全量提取整表复制,增量提取只加新行 ② 全量刷新是「替换」,增量刷新是「追加」,增量标识列决定水位线在哪 ③ 增量刷新只认标识列有没有变大,历史行的修改它一概看不见 ④ 子范围刷新(2024.2+)在追加新行的同时,把最近一段时间重抽一遍 ⑤ 配置的 N 天是「下限」不是「上限」;单位选「天」比选「月」可控 ⑥ 选型依据只有一个:源端会不会改历史数据,以及改动能追溯到多久以前 ⑦ 子范围刷新的时间窗口按 UTC 计算,北京时间下会缺约 8 小时(官方确认为设计使然,非 bug)

一、先分清:三种数据连接方式

理解刷新的前提,是理解数据存在哪里。

Tableau 的三种数据连接方式:实时连接、全量提取、增量提取
  • 实时连接:每次交互都向源库发一次查询,本地不保存任何副本。数据始终与源端一致,但性能系于源库和网络,并发高时会拖慢源系统。适合数据量小或需要实时决策的场景。
  • 全量提取:把整表复制到本地 .hyper 文件,作为离线快照。断开源库也能分析,但每次刷新都要重下全部数据,成本与数据量成正比。
  • 增量提取:只把新增的行复制进已有的 .hyper。速度最快、源库负载最低,代价是抓不到历史行的改动。

一句话区分:实时连接 = 每次查库;全量提取 = 整表复制;增量提取 = 只加新行。

后两者都会落地成 .hyper 文件,真正的差别只在「刷新时下载多少数据」。

二、全量刷新 vs 增量刷新:替换与追加

这是最容易混淆的一组概念,用一个动作就能分清:

全量刷新是替换,增量刷新是追加
  • 全量刷新(Full Refresh) 的逻辑是「替换」。每次刷新先清空整个 .hyper,再从源端重读全部行。即使某行一字未改,也要重新下载一遍。好处是与源端 100% 一致,代价是全表扫描。
  • 增量刷新(Incremental Refresh) 的逻辑是「追加」。保留已有行,只追加标识列大于水位线的新行。秒级完成,但已有行一个都不碰。

根本差异:全量刷新动的是「整个文件」,增量刷新动的是「文件末尾新加的一段」。

三、增量标识列:水位线定在哪

增量标识列是增量刷新的指南针。Tableau 记录上次提取时该列的最高值(水位线),下次只取超过这条线的行。

增量标识列与水位线:Tableau 判断哪些是新行

官方界面中这一项叫「使用列标识新行」,要求是随写入单调递增的列:

  • 日期 / 时间戳(如 created_at)
  • 自增 ID(如 order_id)

唯一键列与非唯一键列

两者的处理方式不同,这是 2024.1 引入的变化:

  • 唯一键列(自增 ID):每行取值唯一。刷新时取「标识列 > 水位线」的行,边界清晰,不重复也不遗漏。
  • 非唯一键列(日期时间):同一时刻可以有多行。2024.1 起 Tableau 增加了一个步骤——先删除提取中等于最高值的行,再查询大于等于最高值的所有行。这样同一时刻迟到写入的记录才不会被漏掉。

关键限制

增量刷新只认「标识列有没有变大」,其他字段的变化它一概看不见。

源端把历史行的订单状态从「待付款」改成「已付款」,标识列没变,增量刷新永远不会更新这一行。这不是缺陷,是设计的取舍——正因为补不上这块短板,才有了子范围刷新。

四、子范围刷新:补上历史修改这块短板

子范围刷新(Sub-range Refresh) 是 Tableau 2024.2 引入的功能,通过「要刷新的最小日期范围」字段配置。它在增量刷新的基础上,额外指定一段时间范围,把这段范围内的已有数据删除并重新提取,从而捕获可能发生的任何历史修改。

前提:子范围刷新只对「日期」或「日期时间」类型的标识列开放。如果标识列用的是自增 ID,这个字段不会出现——这时要抓历史修改,只能回到定期全量刷新。

4.1 一次刷新实际做了三步

子范围刷新的执行过程:追加新行、删除并重抽子范围、合并
  • 第一步:按标识列取水位线之后的所有新行,追加到提取末尾。
  • 第二步:删除最近 N 天的已有行,再从源端整段重新读取。
  • 第三步:合并——历史(范围外)+ 重抽段(范围内)+ 纯新行。

注意它并不是「只刷子范围」,而是增量追加与子范围重抽两步叠加。

4.2 时间范围怎么解释:选「天」比选「月」可控

配置时填一个数字加一个单位。Tableau 的解释方式是:当前时间单位已过的部分 + 前 N 个完整的单位。

子范围刷新的时间范围解释:3 个月与 90 天的差别
  • 设为「3 个月」,4 月 1 日刷新:提取 4 月已过的 1 天 + 前 3 个整月,约 91 天。
  • 设为「3 个月」,4 月 28 日刷新:提取 4 月已过的 28 天 + 前 3 个整月,约 118 天。

同一个配置,实际跨度在 91 ~ 118 天之间漂移。因此官方的最佳实践是:使用对你有意义的最小适用时间单位。想稳定覆盖「刷新日 + 前 90 天」,就填 90 + 天,而不是 3 + 月。

4.3 时区:只按 UTC 计算,北京时间会缺约 8 小时

这是一个文档里不会写明、却很容易踩的坑。

子范围刷新的时间窗口,目前是按 UTC(协调世界时)计算的。如果标识列与业务口径使用的是北京时间(UTC+8),实际重抽的区间会比预期晚 8 小时,表现为约 8 小时的数据覆盖不到。这一点已由笔者实测确认,并与 Tableau 官方确认过:官方不将其视为缺陷(bug),而是当前版本的设计使然。

实践中的两种应对方式:

  • 放宽天数来吸收偏差:需要覆盖 90 天时,配置得略多一些(例如 91 天及以上),用多出来的余量抵消这 8 小时的错位。
  • 源端统一转成 UTC:在 SQL 或 ETL 环节把标识列的时间统一转为 UTC 存储,让口径与 Tableau 的计算基准保持一致,从根上避免偏差。

如果刷新窗口卡得很紧(要求小时级的精确覆盖),建议先在测试环境用真实数据验证一次,再放到生产环境。

4.4 配置的 N 天是下限,不是上限

如果源端待更新的新数据比配置的 N 天更多,Tableau 会一路回溯到「有新数据的起点」全部取回,再叠加配置的 N 天重抽范围。

举例:子范围只配了 2 天,但上次刷新发生在 10 天前——本次会提取 10 天全新数据 + 额外 2 天的重抽范围,共 12 天。

4.5 两个必须记住的前提

  • 源表结构一旦变更(例如新增一列),必须先执行一次完全刷新,之后才能重新开始增量刷新。否则新列不会进入 .hyper。
  • 标识列若包含未来日期(例如「计划交货日期」),子范围刷新的结果可能与预期不符。官方建议基于「记录写入时刻」的日期时间字段做提取。

五、怎么选:一个判断就能定下来

刷新策略决策流程:按源端是否修改历史数据选择
  • 只追加、不修改(日志、交易流水、传感器数据)→ 纯增量刷新,最快最轻量。
  • 追加为主,偶有回溯修改(订单管理、审批流程)→ 增量 + 子范围,推荐配置为 90 + 天。
  • 改动可能落在任意历史时点(CRM、客户主数据)→ 每日增量 + 定期全量,例如每日增量、每周日全量。

三条路共用一个前置条件:源表结构变更后必须先跑一次完全刷新。

六、术语速查

  • 数据提取(Extract):把源库中的数据复制一份到本地 .hyper 文件,作为离线快照。
  • 全量刷新(Full Refresh):删除整个提取,重新从源库下载全部数据。
  • 增量刷新(Incremental Refresh):只把新增的行追加到提取中,已有行不动。
  • 增量标识列:判断哪些行是新数据的列,要求随写入单调递增。官方界面称为「使用列标识新行」。
  • 非唯一键列:同一取值可对应多行(典型是日期)。2024.1 起支持,配套「高级设置」选项。
  • 子范围刷新(Sub-range Refresh):2024.2 起支持。在增量刷新基础上,额外删除并重抽最近一段时间的已有数据。官方界面称为「要刷新的最小日期范围」。
  • Hyper 文件:Tableau 新一代提取格式。2024.2 是可以打开旧版 .tde 的最后一个版本,之后一律为 .hyper。

附:配置侧的约束

机制之外,增量刷新还有几条硬性约束,在 Desktop 与 Server 上的具体操作与踩坑,见姊妹篇 《Tableau Server 服务器增量提取详解》 :

  • 「行数」必须选所有行,样本提取不能做增量刷新
  • 启用聚合后,增量刷新不可用
  • 子范围刷新只对日期或日期时间类型的标识列开放,自增 ID 用不了
  • 子范围刷新的时间窗口按 UTC 计算;标识列若为北京时间,需放宽天数或在源端统一转 UTC
  • 设置了「要刷新的最小日期范围」后,「高级设置」不再可用——两者互斥

No comments yet