我有一个用标准SQL方言编写的长查询,我将多个表连接在一起。我遇到了性能问题,我的查询至少需要9.5秒才能运行。我关闭了缓存并开始调整查询以使其更快,但只看到了边际进展。
我在查询顶部定义了一个用户定义函数(UDF)来处理除以0,如下所示:
CREATE TEMPORARY FUNCTION divide(numerator FLOAT64, denominator FLOAT64)
RETURNS STRING
LANGUAGE js AS """
return (denominator === 0) ? "Not Available" : (100 * (numerator/denominator)) + "%";
""";
我注意到我不再在查询中的任何地方调用UDF,所以我删除了它。令我惊讶的是,删除后查询运行得更快。我跑了很多次,它从未花费超过4.5秒。
为什么只创建UDF会增加查询的运行时间?
答案 0 :(得分:1)
当查询文本中存在用户定义的JavaScript函数时,BigQuery会在每个执行的shard上使用函数的内容初始化JavaScript环境。 (在撰写本文时)没有优化以避免在未引用函数的情况下加载环境,因为期望的是如果存在JavaScript UDF,则意图可能是使用它。您看到的差异是由于JavaScript环境的启动时间。
但是,对于SQL UDF,故事情况有所不同。虽然BigQuery仍然需要解析SQL UDF,无论您是否使用它们来确定实际查询的起始位置,但与此相关的开销很小。