如何减少和监控雪花中的计算资源? [英] How to reduce and monitor Compute resources in Snowflake?
本文介绍了如何减少和监控雪花中的计算资源?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我与发出SQL命令的Snowflake有几个连接,包括手动运行用于调试/开发的即席查询、每天运行两次的任务以创建汇总表,以及Chartio(一个仪表板应用程序)主要针对我的汇总表运行间隔查询。
我最近使用了更多的积分,主要是由于计算资源。我可以对不同仓库的不同连接进行细分,以便分离出这些不同的用户中哪些用户产生的信用最多,但我希望直接使用Snowflake来关联谁在对应于最多信用的时间进行了哪些电话。它不一定是完全自动化的方法,我可以做跑腿工作,我只是不确定如何在不分割仓库的情况下做到这一点,这将需要一些工作和不确定性,因为这会影响生产。
我采取的应该有帮助的明确步骤之一是减小为这些查询提供服务的仓库的大小。但我不确定如何更明确地划分和隔离在这里产生最大成本的是什么。alter warehouse my_wh set warehouse_size=medium;
我在这里的文档中读到了有关资源监视器的内容,但它对隔离方面帮助不大:
https://docs.snowflake.com/en/user-guide/resource-monitors.html
归根结底,最好是由用户监视资源,这样我就可以确定资源的来源,包括向其发出语句的表。
推荐答案
它更像是一个过程,而不是单个事件或一段代码,但这里有一个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
;
这篇关于如何减少和监控雪花中的计算资源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文