挥发性 | 雪花中的不可变行为

Tus*_*rde 3 snowflake-cloud-data-platform

我想了解我们在过程创建期间使用VOLATILEIMMUTABLE关键字的行为

根据文档,我已经理解了这个理论

在此输入图像描述

但我试图了解这两个关键字的实际表现。

我尝试过以下示例

示例 -不可变

CREATE or REPLACE PROCEDURE HELLO_WORLD()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
IMMUTABLE
AS
    $$
        var sql_command = 
     "select id, name from emp";
    try {
        var stmt = snowflake.execute (
            {sqlText: sql_command}
            );
         var a = []
         while (stmt.next()){
            a.push(stmt.getColumnValue(1))
         }
        return a;   
        }
    catch (err)  {
        return "Failed: " + err;  
        }
        
    $$;
    
CALL HELLO_WORLD();
Run Code Online (Sandbox Code Playgroud)

示例 -易失性

CREATE or REPLACE PROCEDURE HELLO_WORLD()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
VOLATILE
AS
    $$
        var sql_command = 
     "select id, name from emp";
    try {
        var stmt = snowflake.execute (
            {sqlText: sql_command}
            );
         var a = []
         while (stmt.next()){
            a.push(stmt.getColumnValue(1))
         }
        return a;   
        }
    catch (err)  {
        return "Failed: " + err;  
        }
        
    $$;
    
CALL HELLO_WORLD();
Run Code Online (Sandbox Code Playgroud)

两者返回相同的输出

[ 3, 2, 1 ]
Run Code Online (Sandbox Code Playgroud)

谁能用任何不同的例子来解释一下吗?

Fel*_*ffa 5

也许使用 UDF(而不是存储过程,但语义是相同的)更容易理解差异:

create or replace function x(a string)
returns float 
language javascript
immutable  -- replace with volatile
as '
return Math.random();
';

select x('1')
from table(generator(rowcount => 5))
Run Code Online (Sandbox Code Playgroud)

当函数不可变时: select 返回 5 个相同的随机数。

当函数易失时: select 返回 5 个不同的随机数。

也许存储过程的文档应该说“该过程可能为相同的输入返回不同的值”,而不是“该过程可能为不同的行返回不同的值”。