首页 > 解决方案 > 雪花 sql udtf 连接性能

问题描述

来自 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;

标签: snowflake-cloud-data-platform

解决方案


从根本上说,这对我来说似乎是错误的。您的 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 的目的是在进行许可时下推过滤,优化器有时看不到过滤器可以下推。


推荐阅读