有没有办法将雪花视图标记为“安全”以便结果重用?

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) 或外部函数。”是最终的。

以上是关于有没有办法将雪花视图标记为“安全”以便结果重用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将存储在雪花中的所有视图下载到本地机器

天气系统:雨雪

在IB中或以编程方式重用不同场景的视图

是否可以将 ActiveX 对象标记为安全以便无需更改 IE 设置?

在雪花中执行多个创建视图语句

有没有办法通过重用视图的 UIScrollView 上的核心动画来更改内容偏移?