雪花仓库:MAX WH 尺寸可以封顶吗?

Dav*_*pin 1 snowflake-cloud-data-platform

是否可以指定仓库的最大大小?

我们希望能够让用户在限制范围内灵活地调整他们的仓库。对于我们的环境,当从 MEDIUM 到 XX-Large 仓库时,查询性能不太可能有很大提高。然而,我们的用户往往会犯偏高的错误,而不是偏低的错误,从而导致高计算成本。

我知道我们可以限制仓库中的集群数量,我们可以使用资源监视器在仓库(或帐户)上实施基于信用的配额,但我真的想从限制 WH 可以设置的最大大小开始首先。

我认为它可能是 WH 的另一个参数,例如 MAX_SIZE = 'M'。

谢谢,

小智 5

假设有一个角色(例如,SYSADMIN)创建所有仓库或具有修改权限。使用该角色创建此过程,然后任何用户都可以调用此 SP,并传递仓库名称和所需大小。由于 SP 作为所有者(相对于调用者)执行,因此调用 SP 的用户不需要对仓库具有 MODIFY 权限,只是他们的角色必须具有对 SP 的使用权限。

CREATE OR REPLACE PROCEDURE utl.arch_set_wh_size_sp(P_WH_NM VARCHAR, P_WH_SIZE VARCHAR)
/****************************************************************************************\
  DESC: set WH size

  YY-MM-DD WHO          CHANGE DESCRIPTION
  -------- ------------ ----------------------------------------------------------------
  19-12-13 eroesch      Initial design
\****************************************************************************************/
  RETURNS STRING
  LANGUAGE JAVASCRIPT
AS $$
  var result = "";
  var sqlCmd = "";
  var sqlStmt = "";
  var rs = "";
  var curSize = "";
  var whSizesAllowed = ["X-SMALL", "XSMALL", "SMALL", "MEDIUM"];

  try {
    // first validate the warehouse exists and get the current size
    sqlCmd = "SHOW WAREHOUSES LIKE '" + P_WH_NM + "'";
    sqlStmt = snowflake.createStatement( {sqlText: sqlCmd} );
    rs = sqlStmt.execute();

    if (sqlStmt.getRowCount() == 0) {
      throw new Error('No Warehouse Found by that name');
    } else {
      rs.next();
      curSize = rs.getColumnValue('size').toUpperCase();
    }

    // next validate the new size is in the acceptable range
    if (whSizesAllowed.indexOf(P_WH_SIZE.toUpperCase()) == -1) {
      throw new Error('Not a valid Warehouse size');
    };

    // set Warehouse size
    sqlCmd = "ALTER WAREHOUSE " + P_WH_NM + " SET WAREHOUSE_SIZE = :1";
    sqlStmt = snowflake.createStatement( {sqlText: sqlCmd, binds: [P_WH_SIZE]} );
    sqlStmt.execute();

    result = "Resized Warehouse " + P_WH_NM + " from: " + curSize + " to: " + P_WH_SIZE.toUpperCase();
  }
  catch (err) {
    if (err.code === undefined) {
      result = err.message
    } else {
      result =  "Failed: Code: " + err.code + " | State: " + err.state;
      result += "\n  Message: " + err.message;
      result += "\nStack Trace:\n" + err.stackTraceTxt; 
      result += "\nParam:\n" + P_WH_NM + ", " + P_WH_SIZE;
    }
  }
  return result;
$$;
Run Code Online (Sandbox Code Playgroud)