【问题标题】:redshift first_value vs min value红移 first_value 与最小值
【发布时间】:2018-10-06 13:36:49
【问题描述】:

试图了解在 Redshift 中使用窗口函数时哪些性能更​​好

min(Case when colc='y' then val else Null end) 
Over(partition by cola,order by colb rows BETWEEN CURRENT ROW and UNBOUNDED FOLLOWING)

first_value(Case when colc='y' then val else Null end) 
Over(partition by cola order by colb rows BETWEEN CURRENT ROW and UNBOUNDED FOLLOWING)

从逻辑上讲,first_value 应该更快,但只是想确认是否有人做过 POC。

【问题讨论】:

  • 首先,为什么它们要产生相等的输出?您按colb 订购但评估val 列,因此first_value 输出可能与min 不同

标签: sql database amazon-redshift window-functions


【解决方案1】:

我还没有做过 POC,我觉得没必要做。这两种结构产生基本相同的执行计划,只是在最低级别有一些小的逻辑差异。您是正确的,first_value() 可以通过检索每行的第一个遇到的值来“短路”执行,而不是“记住”最小值并进行一次额外的比较(只需将当前行中的值与上一行的最小值)。

比较有多重要?好吧,想想是什么驱动了性能。需要读取所有引用列中的数据。 partition by 中的列需要排序或散列。然后需要对 order by 中的列进行排序。完成所有这些工作后,每行额外进行一次比较的差异可以忽略不计。

我不想说它什么都不是——你可能会发现一些东西,比如 1% 的差异。但是,与构造所做的其他所有工作相比,这些额外的工作实际上微不足道。

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多