雪花仓库:MAX WH尺寸可以设置上限吗?

时间:2019-12-23 18:44:47

标签: snowflake-data-warehouse

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

我们希望能够为用户提供在有限的范围内扩展其仓库规模的灵活性。对于我们的环境,从中型仓库到大型XX仓库时,查询性能不太可能会提高很多。然而,我们的用户往往会偏向高端而不是低端,从而导致高昂的计算成本。

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

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

谢谢

3 个答案:

答案 0 :(得分:4)

假定有一个角色(例如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;
$$;

答案 1 :(得分:1)

简短的回答是“不,您不能为仓库的大小设置上限。

一个更长的答案是建立一个过程,以在给定的时间间隔内将仓库大小重置为您认为是“默认”大小的任何大小。

答案 2 :(得分:0)

虽然不是完美的解决方案,但您可以要求SE设置参数WAREHOUSE_MAX_SIZE来限制您帐户中用户可以设置的仓库的大小。