【问题标题】:snowflake sql udtf join performance雪花 sql udtf 连接性能
【发布时间】:2021-04-03 04:43:10
【问题描述】:

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

【问题讨论】:

  • 如果 user_id 是一个 ID aka number 将其转换为一个字符串并在其上执行 join 将不会很好。只需将其保留为 NUMBER。
  • “我真的开始享受使用 CROSS APPLY / OUTER APPLY 模式查询表值函数的乐趣了。” - 毫无疑问,有时会导致性能缓慢!
  • @MitchWheat 有时!

标签: snowflake-cloud-data-platform


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2023-03-22
    • 2023-04-09
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多