Snowflake cloud data platform 物化视图如何设置任务的刷新时间?

Snowflake cloud data platform 物化视图如何设置任务的刷新时间?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我试图设置一个任务,每小时刷新一个物化视图。我试过这个: 我运行并将新数据插入到原始表中。物化视图立即更新 强制删除表时,取消删除构成物化视图的表。这导致了在特定时间的全面恢复,尽管这会很快变得昂贵 下表库存 Undrop表格库存 我在文档中找不到任何关于计划创建Materialized视图的内容。以前有人这样做过吗 您可以挂起和恢复物化视图。但不能查询挂起的MV。你想完成什么?您不会节省资金,只会推迟成本。另一种选择是,您只需通过自定义过程创建自己的物化视图,您可以通过任务进行调度 该过程创建

我试图设置一个任务,每小时刷新一个物化视图。我试过这个:

我运行并将新数据插入到原始表中。物化视图立即更新 强制删除表时,取消删除构成物化视图的表。这导致了在特定时间的全面恢复,尽管这会很快变得昂贵 下表库存

Undrop表格库存


我在文档中找不到任何关于计划创建Materialized视图的内容。以前有人这样做过吗

您可以挂起和恢复物化视图。但不能查询挂起的MV。你想完成什么?您不会节省资金,只会推迟成本。

另一种选择是,您只需通过自定义过程创建自己的物化视图,您可以通过任务进行调度

该过程创建一个与当前表类似的临时表,包括授权。然后将数据从视图插入此表中。最后交换表并删除临时表。最好将其创建为一个临时表,因为不需要时间旅行

CREATE OR REPLACE PROCEDURE utl.arch_create_mview_sp(P_TABLE_NM VARCHAR, P_VIEW_NM VARCHAR)
  RETURNS STRING
  LANGUAGE JAVASCRIPT
  EXECUTE AS CALLER
AS $$
  var result = "";
  var sqlCmd = "";
  var rs = "";
  var tmpTableNM = P_TABLE_NM + "_tmp";

  try {
    sqlCmd = "CREATE OR REPLACE TABLE " + tmpTableNM + " LIKE " + P_TABLE_NM + " COPY GRANTS";
    snowflake.execute( {sqlText: sqlCmd} );

    sqlCmd = "INSERT INTO " + tmpTableNM + " SELECT * FROM " + P_VIEW_NM;
    rs = snowflake.execute( {sqlText: sqlCmd} );
    rs.next();

    result = "rows inserted: " + rs.getColumnValue(1);

    sqlCmd = "ALTER TABLE " + P_TABLE_NM + " SWAP WITH " + tmpTableNM;
    snowflake.execute( {sqlText: sqlCmd} );

    sqlCmd = "DROP TABLE " + tmpTableNM;
    snowflake.execute( {sqlText: sqlCmd} );
  }
  catch (err) {
      result =  "Failed: Code: " + err.code + " | State: " + err.state;
      result += "\n  Message: " + err.message;
      result += "\nStack Trace:\n" + err.stackTraceTxt; 
    }
  }
  return result;
$$;

但是为什么呢?当DML在其基表上运行时,Snowflake会自动使物化视图保持最新。此外,如果您的基表每小时都经历如此多的更改,那么物化视图可能不是正确的解决方案。通常,当物化视图的基表没有经历太多更改,并且物化视图sql经常运行且IO和计算成本较高时,建议使用物化视图。但是,如果您承诺每小时刷新一次物化视图,则可以使用触发刷新。刷新时,对视图进行的查询将针对基表执行,因此速度会变慢。