雪花 sql udtf 连接性能

时间:2021-04-03 04:43:10

标签: snowflake-cloud-data-platform

来自 SQLSERVER 领域,我真的很喜欢使用 CROSS APPLY / OUTER APPLY 模式查询表值函数。看来snowsql 没有那种命令,但我能够复制该功能。你能告诉我它的连接方式是否会出现性能问题吗?

TVF

create or replace function udf_user_friends(user_id varchar)
returns table(user_id varchar,friend_id varchar)
as
$$
  select 
      userjson:user_id::string as user_id
    , f.value::string as friend_id
  from yelp.user u,
    lateral flatten (input=>split(u.userjson:friends, ',')) f
  where userjson:user_id = user_id
$$;

使用 udf 的查询

SELECT 
      u.userjson:user_id::string as user_id
    , t.friend_id
FROM yelp.user u
LEFT JOIN TABLE(udf_user_friends(u.userjson:user_id::string)) t;

1 个答案:

答案 0 :(得分:2)

从根本上说,这对我来说似乎是错误的。您的 UDTF 已连接到您已经从中获取数据的表中......所以它似乎是“隐藏复杂性”的函数类,这也是称为“隐藏性能”的同一类问题。

我开始在删除零值 UDTF 的情况下编写您的外部选择,发现结果是 UDTF 的内容.. 某种程度上证明 UDTF 正在添加零值。

SELECT 
    u.userjson:user_id::string as user_id
    ,f.value::string as friend_id
FROM yelp.user u,
lateral flatten (input=>split(u.userjson:friends, ',')) f

我们使用 UDTF 的目的是在进行许可时向下推过滤,优化器有时看不到过滤器会被向下推。