来自 SQLSERVER 领域,我真的很喜欢使用 CROSS APPLY / OUTER APPLY 模式查询表值函数。看来snowsql 没有那种命令,但我能够复制该功能。你能告诉我它的连接方式是否会出现性能问题吗?
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
$$;
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;
答案 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 的目的是在进行许可时向下推过滤,优化器有时看不到过滤器会被向下推。