来自SQLSERVER领域的我已经真正喜欢上了使用交叉应用/外部应用模式查询表值函数。看起来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;发布于 2021-04-03 13:45:47
从根本上说,这在我看来是相当错误的。您的UDTF正在联接到已有数据的表。因此,它似乎是“隐藏复杂性”的函数类,也是称为“隐藏性能”的同一类问题。
我开始编写删除了零值UDTF的外部select,结果发现结果就是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的目的是在执行许可时向下推送过滤,此时优化器有时看不到可以向下推送过滤器。
https://stackoverflow.com/questions/66927797
复制相似问题