snowflake-cloud-data-platform - 雪花 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;
解决方案
从根本上说,这对我来说似乎是错误的。您的 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 的目的是在进行许可时下推过滤,优化器有时看不到过滤器可以下推。
推荐阅读
- javascript - 只需指向鼠标即可更改对象的颜色
- html - Jquery 认为我的
元素可见,即使显示设置为无和/或可见性设置为隐藏 - apache-spark - Spark 中的链 MinHash 和 LSH (BucketedRandomProjectionLSH) 用于近似距离和误报/误报
- google-app-engine - 是否可以在 Google App Engine 标准环境中使用 Argon2?
- javascript - Packery + Dragable UI 拖后排序
- javascript - d3源代码中带括号的赋值
- java - 当类路径中存在 eclipse moxy jar 时,不考虑 jersey jackson 提供程序
- reactjs - 在路由上显示登录组件,但如果用户不存在,也会显示
- hive - 为什么插入hdfs hive分区表时速度太慢?
- php - 速记如果疯狂,是否可以更聪明地重写?