有没有办法将雪花视图标记为“安全”以便结果重用?
Posted
技术标签:
【中文标题】有没有办法将雪花视图标记为“安全”以便结果重用?【英文标题】:Is there a way to tag a Snowflake view as "safe" for result reuse? 【发布时间】:2021-05-01 22:35:39 【问题描述】:阅读Using Persisted Query Results的Snowflake文档,结果复用必须满足的条件之一如下:
查询不包括用户定义的函数 (UDF) 或外部 功能。
在对这个微不足道的 UDF 和视图进行了一些实验之后:
create function trivial_function(x number)
returns number
as
$$
x
$$
;
create view redo as select trivial_function($1) as col1, $2 as col2
from values (1,2), (3,4);
我已经verified 表示,此条件也适用于对在其定义中使用 UDFs 的视图进行的查询。
问题是,我有一个复杂的视图,它可以从结果重用中受益匪浅,但为了清晰起见,我使用了很多 UDF。一些 UDF 可以内联,但这会使视图更难阅读。并且某些 UDF (those written in javascript) 无法内联。
然而,我知道所有 UDF 在函数式编程意义上都是“纯”的:对于相同的输入,它们总是返回相同的输出。它们不检查当前时间戳、生成随机值或引用其他可能在调用之间发生变化的表。
是否有某种方法可以“说服”查询规划器,尽管存在 UDF,但视图对于结果重用来说是安全的?
【问题讨论】:
【参考方案1】:有一个参数叫IMMUTABLE
:
CREATE FUNCTION
VOLATILE | IMMUTABLE
指定UDF在返回结果时的行为:
VOLATILE:UDF 可能会为不同的行返回不同的值,即使是相同的输入(例如,由于非确定性和全状态)。
IMMUTABLE:UDF 假定当使用相同的输入调用该函数时,将始终返回相同的结果。不检查此保证。为同一输入返回不同值的 UDF 指定 IMMUTABLE 将导致未定义的行为。
默认值:挥发性
【讨论】:
有趣!这应该将 UDF 标记为“安全”,以便结果重用。但是,根据Query Profile Interface,使我的 trivial_function IMMUTABLE 似乎无法在视图中启用结果重用。 @danidiaz 然后我假设条件“查询不包括用户定义的函数 (UDF) 或外部函数。”是最终的。以上是关于有没有办法将雪花视图标记为“安全”以便结果重用?的主要内容,如果未能解决你的问题,请参考以下文章