这更像是一个过程,而不是单个事件或一段代码,但这里有一个 SQL 查询可以提供帮助。要干净地隔离信用消耗,您需要单独的仓库。但是,可以估计用户随时间的信用消耗。这是一个估计值,因为仓库是一种共享资源,而且由于两个或多个用户可以同时使用一个仓库,所以我们能做的最好的事情就是找出一种方法来分配谁负责该消耗的哪一部分。
以下查询使用以下方法估算用户在一段时间内的信用消耗:
- 仓库运行的每个时间段都会在 SNOWFLAKE.ACCOUNT_USAGE.METERING_HISTORY 视图中记录为一行。
- 如果在该段的持续时间内只有一个用户处于活动状态,则查询会将 100% 的使用量分配给该用户。
- 如果在一个段的持续时间内有多个用户处于活动状态,则查询将获取一个用户的总查询运行时间,然后将其除以该段中所有用户的总查询运行时间。这会按查询运行时按比例分配共享仓库。
#3 是近似值,但如果您不将其用于退款或向某人收取数据共享使用费用,则它是合适的。
请务必将仓库名称更改为您的 WH 名称,并为您要检查使用情况的持续时间设置开始和结束时间戳。
with
TF(WH_NAME, START_DATE, END_DATE) as
(
-- Warehouse Start Date End Date
select 'TEST', '2021-04-01', '2021-05-01' -- Replace values here
),
WH(START_TIME, END_TIME, CREDITS_USED) as
(
select START_TIME, END_TIME, CREDITS_USED
from "SNOWFLAKE"."ACCOUNT_USAGE"."METERING_HISTORY", TF
where "NAME" = TF.WH_NAME and
"START_TIME" >= TF.START_DATE and
"END_TIME" <= TF.END_DATE
),
QRY(USER_NAME, START_TIME, END_TIME, DURATION) as
(
select USER_NAME, START_TIME, END_TIME, TOTAL_ELAPSED_TIME
from "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY", TF
where "WAREHOUSE_NAME" = TF.WH_NAME and
"START_TIME" >= TF.START_DATE and
"END_TIME" <= TF.END_DATE
),
DUR(USER_NAME, WH_START_TIME, WH_END_TIME, DURATION) as
(
select QRY.USER_NAME as USER_NAME
,WH.START_TIME as WH_START_TIME
,WH.END_TIME as WH_END_TIME
,sum(QRY.DURATION) as QRY_DURATION
from WH
left join QRY on
QRY.START_TIME > WH.START_TIME and
QRY.END_TIME < WH.END_TIME
group by WH_START_TIME, WH_END_TIME, USER_NAME
),
WHBU (WH_START_TIME, WH_END_TIME, CREDITS, DURATION, USER_NAME) as
(
select WH.START_TIME as WH_START_TIME
,WH.END_TIME as WH_END_TIME
,WH.CREDITS_USED as CREDITS
,DUR.DURATION as DURATION
,DUR.USER_NAME as USER_NAME
from WH
left join DUR on WH.START_TIME = DUR.WH_START_TIME and
WH.END_TIME = DUR.WH_END_TIME
order by WH.START_TIME, USER_NAME
),
CBU(USER_NAME, CREDITS) as
(
select USER_NAME
,CREDITS * DURATION / sum(DURATION) over (partition by WH_START_TIME, WH_END_TIME) as PRO_RATED_CREDITS
from WHBU
)
select USER_NAME
,sum(CREDITS) as ESTIMATED_CREDITS
from CBU
group by USER_NAME
order by ESTIMATED_CREDITS desc
;