Teradata 16升级后查询Spool空间暴增,优化后恢复,求原因解析
咱们先从你的查询改动和Teradata 16的优化器特性变化入手,一步步拆解问题:
核心差异:提前聚合TABLE3的作用
你优化前后的核心区别,是把原查询中直接关联全量TABLE3的逻辑,改成了先对TABLE3的FF和YY字段做聚合去重,再参与后续连接。这个改动直接把Spool占用从1.5TB打回200GB以内,本质是提前砍掉了大量冗余数据——而这恰恰戳中了Teradata 16升级后执行计划变化的痛点。
升级后Spool暴涨的关键原因
Teradata 16对Cost-Based Optimizer(CBO)做了不少迭代优化,但也可能在某些场景下改变了执行计划的生成逻辑,导致你的查询出现异常:
连接顺序与中间结果集膨胀
旧版本中,优化器可能会自动选择先关联TABLE2和TABLE3(因为TABLE3提前做了隐式去重或基数较低),再和TABLE1连接,中间结果集可控。但升级到16后,CBO可能基于新的成本模型,选择了先连接TABLE1和TABLE2,再去关联全量的TABLE3。如果TABLE3中FF字段存在大量重复值,这会让连接后的中间结果集急剧膨胀,直接撑爆Spool。子查询物化策略的调整
Teradata 16可能改变了子查询的物化规则:旧版本中,优化器可能会自动对多表连接后的重复数据提前做去重处理,但16版本的CBO可能更倾向于保留全量中间数据再做最终GROUP BY。这就导致三个表全连接后,生成了大量包含重复XX/YY组合的数据,Spool需要承载远超预期的数据量。统计信息的适配问题
升级后如果没有重新收集全表统计信息,CBO可能基于旧版本的统计数据(比如TABLE3的FF字段基数统计不准确),错误判断了连接后的结果集大小,从而选择了低效的执行路径。比如它误以为TABLE3的FF字段重复率很低,不需要提前去重,最终导致Spool过载。
你的优化为什么有效
你提前对TABLE3做GROUP BY FF, YY,相当于手动告诉优化器:先把TABLE3里重复的FF/YY组合去掉,再参与后续连接。这直接减少了后续连接的数据量,让执行计划回到了和旧版本类似的高效路径,Spool占用自然就降下来了。
内容的提问来源于stack exchange,提问作者madsthiru

