SQL优化之暴力扫描

last modify

Keywords: sql优化, hive sql, hql

背景

  • 例行任务每天暴力扫描上游任务的多个分区,造成了资源浪费。

  • 示例:

    • 该任务每天扫描历史60天的数据, 统计 query 的点击数, 但其实每天有 59 天是重复扫描的;

解决方案

法1) 提取中间表

  • 一般出现暴力扫描主要原因是总数据量太大; 一般是因为上游表是一张宽表, 保存了太多数据;

  • 中间表就是把需要的数据单独取出来, 也按天存储; 然后下游扫描这张小表即可;

  • 这个方法非常简单, 缺点是需要回跑天数较多, 有些平台可能会有限制;

法2) 滑动窗口

  • 注意滑动窗口并不一定能降低资源, 如果源表不大的话, 反而会增加消耗的资源;

例1: 滑动计算统计数据

  • 这里要注意一点, 如果上游表 src_table 只保存 60 天的数据, 那么要小心 DATA_SUB('$today', 60) 的操作, 因为这实际上是前 61 天的数据, 可能不存在, 此时 n_clk 会一直增加;

例2: 保存所有数据

  • 如果是无法滑动计算的特征, 那么可以考虑把历史数据都保存下来;

  • 仅适用于聚合表;

例3: 通过最新日期过滤

Last updated