雪花动态存储过程

时间:2021-03-26 03:27:13

标签: snowflake-cloud-data-platform

我有一个雪花 Javascript 存储过程,它接受 2 个参数并根据从 UI 中选择的列执行运行时动态聚合

在下面添加更多上下文

  • 所选列的 1 个参数(从 UI 发送的所选过滤器/下拉属性或列名)
  • 为第 1 点中选择的类似下拉值准备的动态 where 子句的 2 个参数

从视图中获取数据并以这种方式检索结果

CREATE OR REPLACE PROCEDURE database.schema.sp_sample(dynamic_columns VARCHAR, dynamic_where_clause VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS 
$$
rs="Success";
try {
retrieve_queries_sql = `SELECT COL_1, COL_2, ${DYNAMIC_COLUMNS} FROM view ${DYNAMIC_WHERE_CLAUSE} GROUP BY COL_1, COL_2, ${DYNAMIC_COLUMNS}`;
var stmt = snowflake.createStatement( {sqlText: retrieve_queries_sql, binds:[DYNAMIC_COLUMNS, DYNAMIC_WHERE_CLAUSE, DYNAMIC_COLUMNS]} );
var rs = stmt.execute();
}
catch(err) {
rs= "Failed Message: "+err.message;
}
return rs;
$$;

CALL "database"."schema"."sp_sample"('COL_3','WHERE COL_3\=\'somevalue\'');
SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)));

注意:此时不需要显示特定用户的数据。同样忽略上面代码中的参数插值部分

问题:

  1. 是否担心这个雪花动态存储过程被这个 UI 应用程序调用(多个用户同时在 UI 上选择值,这个动态过程在内部会被调用多次)及其读取操作(仅选择只需获取用户选择的下拉层次结构/级别的聚合值)

  2. 是否存在数据完整性问题,不同用户将不会在 UI 上看到更新的值(以提供更多上下文数据是从此过程中的视图中获取的,并且此视图数据在应用程序实时运行期间不会更改) / 活动时间 - 所有批次将在用户访问应用程序之前完成)。因此,数据已准备就绪,当用户访问应用程序时,预计不会对数据进行任何更改

  3. 从某人那里得到了一个建议,即动态过程会导致数据完整性问题,用户将无法看到更新的数据并解决该数据完整性问题预聚合视图(意味着数据在特定时间进行预聚合)级别并保存在不同的视图中)会有所帮助,并且数据一致性会更好。

想了解这个预聚合视图的提议如何帮助解决数据完整性问题(首先为什么会有数据完整性问题),因为程序中所做的是获取来自视图的数据(动态聚合),即使在后一种方法中,我们仍在创建许多其他视图(预聚合),最终我们在这两种情况下都从视图获取数据,后者如何不会引起数据完整性问题?

如果提供的要点有意义,请分享一些反馈。想知道更好的意见

1 个答案:

答案 0 :(得分:0)

  1. 不,没有问题。 LAST_QUERY_ID 返回当前会话中指定查询的 ID。

https://docs.snowflake.com/en/sql-reference/functions/last_query_id.html

  1. 不,不会有任何数据完整性问题 - 这与直接执行复杂 SQL 没有什么不同。您可以检查隔离级别:

https://docs.snowflake.com/en/sql-reference/transactions.html#isolation-level

  1. 我不明白它对数据完整性有何帮助。事实上,如果您使用这种方法,如果您将此预先聚合的数据与最新数据结合起来,您可能会遇到数据完整性问题。也许他们是认为 Snowflake 是 Hadoop 变体的同一个人? :)