Expedition. ๋ฌด๋ฃŒ ์˜จ๋ผ์ธ ํ–‰์‚ฌ, 11์›” 3~6์ผ.

์‹ค๋ฌด์ž๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ  ํŠธ๋ž™๊ณผ ๋ฆฌ๋”๋ฅผ ์œ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ๊ณผ๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”.

Quickstart

Resource Optimization: Usage Monitoring

Matt Meredith

๊ฐœ์š”

์ด ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” ๊ฐ€์ด๋“œ๋Š” ํ•ด๋‹น ์‹œ๋ฆฌ์ฆˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” 4๊ฐœ์˜ ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ด๋“œ๋Š” ๊ณ ๊ฐ์ด ์ž์‹ ์˜ ํฌ๋ ˆ๋”ง ์†Œ๋น„๋ฅผ ๋” ์ž˜ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ์ž์‹ ์˜ ํฌ๋ ˆ๋”ง์ด ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ž์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ฒƒ์€ ์ง€์†์ ์ด๋ฉฐ ์„ฑ๊ณต์ ์ธ ํŒŒํŠธ๋„ˆ์‹ญ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Snowflake ๋น ๋ฅธ ์‹œ์ž‘ ์„ธํŠธ์™€ ๋”๋ถˆ์–ด Snowflake๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›, ๊ต์œก ๋ฐ ํ”„๋กœํŽ˜์…”๋„ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์œ ๋ฃŒ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค๊ฐ€์˜ค๋Š” ํ›ˆ๋ จ ๋ฐ ๊ต์œก์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด Snowflake์˜ ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” ๊ธฐ๋Šฅ์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

marketing@snowflake.com์œผ๋กœ Snowflake ํŒ€์— ๋ฌธ์˜ํ•˜์‹ญ์‹œ์˜ค. Snowflake๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์„ ์†Œ์ค‘ํ•˜๊ฒŒ ์—ฌ๊น๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง

์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฟผ๋ฆฌ๋Š” ์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š” ์›จ์–ดํ•˜์šฐ์Šค, ์ฟผ๋ฆฌ, ๋„๊ตฌ ๋ฐ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋Š” ์˜ˆ์ธกํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์†Œ๋น„๋ฅผ ์ค„์ด๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šตํ•  ๋‚ด์šฉ

  • ์†Œ๋น„ ๋™ํ–ฅ ๋ฐ ํŒจํ„ด ๋ถ„์„ ๋ฐฉ๋ฒ•
  • ์†Œ๋น„ ๋ณ€์น™ ํ™•์ธ ๋ฐฉ๋ฒ•
  • ํŒŒํŠธ๋„ˆ ๋„๊ตฌ ์†Œ๋น„ ๋ฉ”ํŠธ๋ฆญ ๋ถ„์„ ๋ฐฉ๋ฒ•

ํ•„์š”ํ•œ ๊ฒƒ

๊ด€๋ จ ์ž๋ฃŒ

  • ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”: ์„ค์ • ๋ฐ ๊ตฌ์„ฑ
  • ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”: ์ฒญ๊ตฌ ๋ฉ”ํŠธ๋ฆญ
  • ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”: ์„ฑ๋Šฅ

์ฟผ๋ฆฌ Tier

๋ฆฌ์†Œ์Šค ์ตœ์ ํ™” Snowflake ๋น ๋ฅธ ์‹œ์ž‘ ๋‚ด์— ์žˆ๋Š” ๊ฐ ์ฟผ๋ฆฌ ์ด๋ฆ„์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” โ€˜(T*)โ€™๋กœ Tier ์ง€์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ Tier ์„ค๋ช…์€ ์ด๋Ÿฌํ•œ ์ง€์ •์„ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Tier 1 ์ฟผ๋ฆฌ

๋ณธ์งˆ์ ์œผ๋กœ Tier 1 ์ฟผ๋ฆฌ๋Š” Snowflake์˜ ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ๊ณ ๊ฐ์ด ๊ทœ๋ชจ, ์—…๊ณ„, ์œ„์น˜ ๋“ฑ์— ๊ด€๊ณ„์—†์ด ์ž์‹ ์˜ ์†Œ๋น„ ๋ชจ๋‹ˆํ„ฐ๋ง์— ๋Œ€ํ•ด ๋„์›€์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tier 2 ์ฟผ๋ฆฌ

Tier 2 ์ฟผ๋ฆฌ๋Š” ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๊นŠ์ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋™์‹œ์— ํ”„๋กœ์„ธ์Šค์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ณ ๊ฐ๊ณผ ๊ณ ๊ฐ์˜ ์›Œํฌ๋กœ๋“œ์— ํ•„์ˆ˜์ ์ด์ง€๋Š” ์•Š์„์ง€๋ผ๋„ ๊ณผ๋„ํ•œ ์†Œ๋น„๊ฐ€ ํ™•์ธ๋˜์—ˆ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ถ”๊ฐ€ ์˜์—ญ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์„ค๋ช…์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tier 3 ์ฟผ๋ฆฌ

๋งˆ์ง€๋ง‰์œผ๋กœ Tier 3 ์ฟผ๋ฆฌ๋Š” Snowflake ์†Œ๋น„๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๋ชจ๋“  ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณ ๊ฐ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋Š” ์ด ํ”„๋กœ์„ธ์Šค์—์„œ ์—ฌ์ „ํžˆ ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ Tier 1 ๋ฐ 2์˜ ์ฟผ๋ฆฌ๋งŒํผ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Credit Consumption by Warehouse (T1)

Tier 1

์„ค๋ช…:

์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ ์›จ์–ดํ•˜์šฐ์Šค์˜ ์ด ํฌ๋ ˆ๋”ง ์†Œ๋น„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

๋‹ค๋ฅธ ์›จ์–ดํ•˜์šฐ์Šค๋ณด๋‹ค ๋” ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š” ํŠน์ • ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์žˆ๋‚˜์š”? ์žˆ์–ด์•ผ ํ•˜๋‚˜์š”? ํ•ด๋‹น ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์˜ˆ์ธกํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š” ํŠน์ • ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์žˆ๋‚˜์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

// Credits used (all time = past year)
SELECT WAREHOUSE_NAME
      ,SUM(CREDITS_USED_COMPUTE) AS CREDITS_USED_COMPUTE_SUM
  FROM ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
 GROUP BY 1
 ORDER BY 2 DESC
;

// Credits used (past N days/weeks/months)
SELECT WAREHOUSE_NAME
      ,SUM(CREDITS_USED_COMPUTE) AS CREDITS_USED_COMPUTE_SUM
  FROM ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
 WHERE START_TIME >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())  // Past 7 days
 GROUP BY 1
 ORDER BY 2 DESC
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Average Hour-by-Hour Consumption Over the Past 7 Days (T1)

Tier 1

์„ค๋ช…:

์ง€๋‚œ 7์ผ๊ฐ„์˜ ์†Œ๋น„ ๋™ํ–ฅ(๊ฐ€์žฅ ๋งŽ์€ ๋•Œ, ๊ฐ€์žฅ ๋‚ฎ์„ ๋•Œ)์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ๊ฐ„๋ณ„๋กœ ์ด ํฌ๋ ˆ๋”ง ์†Œ๋น„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

ํ•˜๋ฃจ ์ค‘ ์–ด๋–ค ์‹œ๊ฐ„์— ์†Œ๋น„๊ฐ€ ๊ธ‰์ฆํ•˜๋‚˜์š”? ์˜ˆ์ธกํ•œ ๋Œ€๋กœ์ธ๊ฐ€์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL(์‹œ๊ฐ„, ์›จ์–ดํ•˜์šฐ์Šค๋ณ„)

// Credits used by [hour, warehouse] (past 7 days)
SELECT START_TIME
      ,WAREHOUSE_NAME
      ,CREDITS_USED_COMPUTE
  FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
 WHERE START_TIME >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
   AND WAREHOUSE_ID > 0  // Skip pseudo-VWs such as "CLOUD_SERVICES_ONLY"
 ORDER BY 1 DESC,2
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here
####SQL(์‹œ๊ฐ„)
SELECT DATE_PART('HOUR', START_TIME) AS START_HOUR
      ,WAREHOUSE_NAME
      ,AVG(CREDITS_USED_COMPUTE) AS CREDITS_USED_COMPUTE_AVG
  FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
 WHERE START_TIME >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
   AND WAREHOUSE_ID > 0  // Skip pseudo-VWs such as "CLOUD_SERVICES_ONLY"
 GROUP BY 1, 2
 ORDER BY 1, 2
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Average Query Volume by Hour (Past 7 Days) (T1)

Tier 1

์„ค๋ช…:

์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ ํ™œ๋™์„ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์‹œ๊ฐ„๋ณ„๋กœ ์‹คํ–‰๋˜๋Š” ํ‰๊ท  ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์‹œ๊ฐ„๋ณ„๋กœ ๋ช‡ ๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋‚˜์š”? ์˜ˆ์ธกํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ๊ฑฐ๋‚˜ ์ ์€๊ฐ€์š”? ์ด๋Ÿฌํ•œ ํ˜„์ƒ์˜ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

SELECT DATE_TRUNC('HOUR', START_TIME) AS QUERY_START_HOUR
      ,WAREHOUSE_NAME
      ,COUNT(*) AS NUM_QUERIES
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
 WHERE START_TIME >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())  // Past 7 days
 GROUP BY 1, 2
 ORDER BY 1 DESC, 2
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Warehouse Utilization Over 7 Day Average (T1)

Tier 1

์„ค๋ช…:

์ด ์ฟผ๋ฆฌ๋Š” ์ฃผ ๋ฐ ์›จ์–ดํ•˜์šฐ์Šค๋ณ„๋กœ ๊ทธ๋ฃนํ™”๋œ ์ผ๋ณ„ ํ‰๊ท  ํฌ๋ ˆ๋”ง ์†Œ๋น„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋…„ ์ฃผ์— ๊ฑธ์ณ ์›จ์–ดํ•˜์šฐ์Šค์˜ ํฌ๋ ˆ๋”ง ์†Œ๋น„ ๋ณ€์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

WITH CTE_DATE_WH AS(
  SELECT TO_DATE(START_TIME) AS START_DATE
        ,WAREHOUSE_NAME
        ,SUM(CREDITS_USED) AS CREDITS_USED_DATE_WH
    FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
   GROUP BY START_DATE
           ,WAREHOUSE_NAME
)
SELECT START_DATE
      ,WAREHOUSE_NAME
      ,CREDITS_USED_DATE_WH
      ,AVG(CREDITS_USED_DATE_WH) OVER (PARTITION BY WAREHOUSE_NAME ORDER BY START_DATE ROWS 7 PRECEDING) AS CREDITS_USED_7_DAY_AVG
      ,100.0*((CREDITS_USED_DATE_WH / CREDITS_USED_7_DAY_AVG) - 1) AS PCT_OVER_TO_7_DAY_AVERAGE
  FROM CTE_DATE_WH
QUALIFY CREDITS_USED_DATE_WH > 100  // Minimum N=100 credits
    AND PCT_OVER_TO_7_DAY_AVERAGE >= 0.5  // Minimum 50% increase over past 7 day average
 ORDER BY PCT_OVER_TO_7_DAY_AVERAGE DESC
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Forecasting Usage/Billing (T1)

Tier 1

์„ค๋ช…:

์ด ์ฟผ๋ฆฌ๋Š” ๊ณ„์•ฝ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ผ๋ณ„๋กœ 3๊ฐœ์˜ ๋‹ค๋ฅธ ์†Œ๋น„ ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. (1) ๊ณ„์•ฝ๋œ ์†Œ๋น„๋Š” ์ „์ฒด ๊ธฐ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉ๋Ÿ‰์ด ์ผ์ •ํ•  ๊ฒฝ์šฐ ์†Œ๋น„๋˜๋Š” ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค. (2) ์‹ค์ œ ์†Œ๋น„๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ทฐ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋ฉฐ ์ผ๋ณ„ ์ˆ˜์ค€์œผ๋กœ ๊ธˆ์•ก์„ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. (3) ์˜ˆ์ธก๋œ ์†Œ๋น„๋Š” ์•ž์œผ๋กœ์˜ ์†Œ๋น„๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ๋ฐ์ดํ„ฐ์—์„œ ์ง์„  ํšŒ๊ท€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์ด ๋ฐ์ดํ„ฐ๋Š” ๊ณ„์•ฝ ๊ธˆ์•ก๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฏธ๋ž˜ ์˜ˆ์ธก์„ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์ธ ์ด๊ณ„์‚ฐ์„ ํ†ตํ•ด ์„  ๊ทธ๋ž˜ํ”„๋กœ ๋งคํ•‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

SET CREDIT_PRICE = 4.00; --edit this number to reflect credit price
SET TERM_LENGTH = 12; --integer value in months
SET TERM_START_DATE = '2020-01-01';
SET TERM_AMOUNT = 100000.00; --number(10,2) value in dollars
WITH CONTRACT_VALUES AS (
     SELECT
              $CREDIT_PRICE::decimal(10,2) as CREDIT_PRICE
             ,$TERM_AMOUNT::decimal(38,0) as TOTAL_CONTRACT_VALUE
             ,$TERM_START_DATE::timestamp as CONTRACT_START_DATE
             ,DATEADD(day,-1,DATEADD(month,$TERM_LENGTH,$TERM_START_DATE))::timestamp as CONTRACT_END_DATE
),
PROJECTED_USAGE AS (
     SELECT
                CREDIT_PRICE
               ,TOTAL_CONTRACT_VALUE
               ,CONTRACT_START_DATE
               ,CONTRACT_END_DATE
               ,(TOTAL_CONTRACT_VALUE)
                   /
                   DATEDIFF(day,CONTRACT_START_DATE,CONTRACT_END_DATE)  AS DOLLARS_PER_DAY
               , (TOTAL_CONTRACT_VALUE/CREDIT_PRICE)
                   /
               DATEDIFF(day,CONTRACT_START_DATE,CONTRACT_END_DATE) AS CREDITS_PER_DAY
     FROM      CONTRACT_VALUES
),
ACTUAL_USAGE AS (
 SELECT TO_DATE(START_TIME) AS CONSUMPTION_DATE
   ,SUM(DOLLARS_USED) as ACTUAL_DOLLARS_USED
 FROM (
   --COMPUTE FROM WAREHOUSES
   SELECT
            'WH Compute' as WAREHOUSE_GROUP_NAME
           ,WMH.WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,WMH.START_TIME
           ,WMH.END_TIME
           ,WMH.CREDITS_USED
           ,$CREDIT_PRICE
           ,($CREDIT_PRICE*WMH.CREDITS_USED) AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE                  
   from    SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY WMH
   UNION ALL
   --COMPUTE FROM SNOWPIPE
   SELECT
            'Snowpipe' AS WAREHOUSE_GROUP_NAME
           ,PUH.PIPE_NAME AS WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,PUH.START_TIME
           ,PUH.END_TIME
           ,PUH.CREDITS_USED
           ,$CREDIT_PRICE
           ,($CREDIT_PRICE*PUH.CREDITS_USED) AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE
   from    SNOWFLAKE.ACCOUNT_USAGE.PIPE_USAGE_HISTORY PUH
   UNION ALL
   --COMPUTE FROM CLUSTERING
   SELECT
            'Auto Clustering' AS WAREHOUSE_GROUP_NAME
           ,DATABASE_NAME || '.' || SCHEMA_NAME || '.' || TABLE_NAME AS WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,ACH.START_TIME
           ,ACH.END_TIME
           ,ACH.CREDITS_USED
           ,$CREDIT_PRICE
           ,($CREDIT_PRICE*ACH.CREDITS_USED) AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE
   from    SNOWFLAKE.ACCOUNT_USAGE.AUTOMATIC_CLUSTERING_HISTORY ACH
   UNION ALL
   --COMPUTE FROM MATERIALIZED VIEWS
   SELECT
            'Materialized Views' AS WAREHOUSE_GROUP_NAME
           ,DATABASE_NAME || '.' || SCHEMA_NAME || '.' || TABLE_NAME AS WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,MVH.START_TIME
           ,MVH.END_TIME
           ,MVH.CREDITS_USED
           ,$CREDIT_PRICE
           ,($CREDIT_PRICE*MVH.CREDITS_USED) AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE
   from    SNOWFLAKE.ACCOUNT_USAGE.MATERIALIZED_VIEW_REFRESH_HISTORY MVH
   UNION ALL
   --COMPUTE FROM SEARCH OPTIMIZATION
   SELECT
            'Search Optimization' AS WAREHOUSE_GROUP_NAME
           ,DATABASE_NAME || '.' || SCHEMA_NAME || '.' || TABLE_NAME AS WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,SOH.START_TIME
           ,SOH.END_TIME
           ,SOH.CREDITS_USED
           ,$CREDIT_PRICE
           ,($CREDIT_PRICE*SOH.CREDITS_USED) AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE
   from    SNOWFLAKE.ACCOUNT_USAGE.SEARCH_OPTIMIZATION_HISTORY SOH
   UNION ALL
   --COMPUTE FROM REPLICATION
   SELECT
            'Replication' AS WAREHOUSE_GROUP_NAME
           ,DATABASE_NAME AS WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,RUH.START_TIME
           ,RUH.END_TIME
           ,RUH.CREDITS_USED
           ,$CREDIT_PRICE
           ,($CREDIT_PRICE*RUH.CREDITS_USED) AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE
   from    SNOWFLAKE.ACCOUNT_USAGE.REPLICATION_USAGE_HISTORY RUH
   UNION ALL

   --STORAGE COSTS
   SELECT
            'Storage' AS WAREHOUSE_GROUP_NAME
           ,'Storage' AS WAREHOUSE_NAME
           ,NULL AS GROUP_CONTACT
           ,NULL AS GROUP_COST_CENTER
           ,NULL AS GROUP_COMMENT
           ,SU.USAGE_DATE
           ,SU.USAGE_DATE
           ,NULL AS CREDITS_USED
           ,$CREDIT_PRICE
           ,((STORAGE_BYTES + STAGE_BYTES + FAILSAFE_BYTES)/(1024*1024*1024*1024)*23)/DA.DAYS_IN_MONTH AS DOLLARS_USED
           ,'ACTUAL COMPUTE' AS MEASURE_TYPE
   from    SNOWFLAKE.ACCOUNT_USAGE.STORAGE_USAGE SU
   JOIN    (SELECT COUNT(*) AS DAYS_IN_MONTH,TO_DATE(DATE_PART('year',D_DATE)||'-'||DATE_PART('month',D_DATE)||'-01') as DATE_MONTH FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.DATE_DIM GROUP BY TO_DATE(DATE_PART('year',D_DATE)||'-'||DATE_PART('month',D_DATE)||'-01')) DA ON DA.DATE_MONTH = TO_DATE(DATE_PART('year',USAGE_DATE)||'-'||DATE_PART('month',USAGE_DATE)||'-01')
) A
 group by 1
),
FORECASTED_USAGE_SLOPE_INTERCEPT as (
 SELECT
          REGR_SLOPE(AU.ACTUAL_DOLLARS_USED,DATEDIFF(day,CONTRACT_START_DATE,AU.CONSUMPTION_DATE)) as SLOPE
          ,REGR_INTERCEPT(AU.ACTUAL_DOLLARS_USED,DATEDIFF(day,CONTRACT_START_DATE,AU.CONSUMPTION_DATE)) as INTERCEPT
 FROM        PROJECTED_USAGE PU
 JOIN        SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.DATE_DIM DA ON DA.D_DATE BETWEEN PU.CONTRACT_START_DATE AND PU.CONTRACT_END_DATE
 LEFT JOIN   ACTUAL_USAGE AU ON AU.CONSUMPTION_DATE = TO_DATE(DA.D_DATE)
)
SELECT
        DA.D_DATE::date as CONSUMPTION_DATE
       ,PU.DOLLARS_PER_DAY AS CONTRACTED_DOLLARS_USED
       ,AU.ACTUAL_DOLLARS_USED
       --the below is the mx+b equation to get the forecasted linear slope
       ,DATEDIFF(day,CONTRACT_START_DATE,DA.D_DATE)*FU.SLOPE + FU.INTERCEPT AS FORECASTED_DOLLARS_USED
FROM        PROJECTED_USAGE PU
JOIN        SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.DATE_DIM    DA ON DA.D_DATE BETWEEN PU.CONTRACT_START_DATE AND PU.CONTRACT_END_DATE
LEFT JOIN   ACTUAL_USAGE                                    AU ON AU.CONSUMPTION_DATE = TO_DATE(DA.D_DATE)
JOIN        FORECASTED_USAGE_SLOPE_INTERCEPT                FU ON 1 = 1
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Partner Tools Consuming Credits (T1)

Tier 1

์„ค๋ช…:

์–ด๋–ค Snowflake ํŒŒํŠธ๋„ˆ ๋„๊ตฌ/์†”๋ฃจ์…˜(BI, ETL ๋“ฑ)์ด ๊ฐ€์žฅ ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š”์ง€ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์˜ˆ์ธกํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š” ํŠน์ • ํŒŒํŠธ๋„ˆ ์†”๋ฃจ์…˜์ด ์žˆ๋‚˜์š”? ์ด๋Ÿฌํ•œ ํ˜„์ƒ์˜ ์›์ธ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

--THIS IS APPROXIMATE CREDIT CONSUMPTION BY CLIENT APPLICATION
WITH CLIENT_HOUR_EXECUTION_CTE AS (
    SELECT  CASE
         WHEN CLIENT_APPLICATION_ID LIKE 'Go %' THEN 'Go'
         WHEN CLIENT_APPLICATION_ID LIKE 'Snowflake UI %' THEN 'Snowflake UI'
         WHEN CLIENT_APPLICATION_ID LIKE 'SnowSQL %' THEN 'SnowSQL'
         WHEN CLIENT_APPLICATION_ID LIKE 'JDBC %' THEN 'JDBC'
         WHEN CLIENT_APPLICATION_ID LIKE 'PythonConnector %' THEN 'Python'
         WHEN CLIENT_APPLICATION_ID LIKE 'ODBC %' THEN 'ODBC'
         ELSE 'NOT YET MAPPED: ' || CLIENT_APPLICATION_ID
       END AS CLIENT_APPLICATION_NAME
    ,WAREHOUSE_NAME
    ,DATE_TRUNC('hour',START_TIME) as START_TIME_HOUR
    ,SUM(EXECUTION_TIME)  as CLIENT_HOUR_EXECUTION_TIME
    FROM "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" QH
    JOIN "SNOWFLAKE"."ACCOUNT_USAGE"."SESSIONS" SE ON SE.SESSION_ID = QH.SESSION_ID
    WHERE WAREHOUSE_NAME IS NOT NULL
    AND EXECUTION_TIME > 0
  
 --Change the below filter if you want to look at a longer range than the last 1 month 
    AND START_TIME > DATEADD(Month,-1,CURRENT_TIMESTAMP())
    group by 1,2,3
    )
, HOUR_EXECUTION_CTE AS (
    SELECT  START_TIME_HOUR
    ,WAREHOUSE_NAME
    ,SUM(CLIENT_HOUR_EXECUTION_TIME) AS HOUR_EXECUTION_TIME
    FROM CLIENT_HOUR_EXECUTION_CTE
    group by 1,2
)
, APPROXIMATE_CREDITS AS (
    SELECT 
    A.CLIENT_APPLICATION_NAME
    ,C.WAREHOUSE_NAME
    ,(A.CLIENT_HOUR_EXECUTION_TIME/B.HOUR_EXECUTION_TIME)*C.CREDITS_USED AS APPROXIMATE_CREDITS_USED

    FROM CLIENT_HOUR_EXECUTION_CTE A
    JOIN HOUR_EXECUTION_CTE B  ON A.START_TIME_HOUR = B.START_TIME_HOUR and B.WAREHOUSE_NAME = A.WAREHOUSE_NAME
    JOIN "SNOWFLAKE"."ACCOUNT_USAGE"."WAREHOUSE_METERING_HISTORY" C ON C.WAREHOUSE_NAME = A.WAREHOUSE_NAME AND C.START_TIME = A.START_TIME_HOUR
)

SELECT 
 CLIENT_APPLICATION_NAME
,WAREHOUSE_NAME
,SUM(APPROXIMATE_CREDITS_USED) AS APPROXIMATE_CREDITS_USED
FROM APPROXIMATE_CREDITS
GROUP BY 1,2
ORDER BY 3 DESC
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Credit Consumption by User (T1)

Tier 1

์„ค๋ช…:

์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ Snowflake ํ™˜๊ฒฝ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š”์ง€ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์ง€์ •๋œ ์–‘๋ณด๋‹ค ๋” ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ์†Œ๋น„ํ•˜๋Š” ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋‚˜์š”? ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ์‚ฌ์šฉ๋Ÿ‰์˜ ๋ชฉ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

--THIS IS APPROXIMATE CREDIT CONSUMPTION BY USER
WITH USER_HOUR_EXECUTION_CTE AS (
    SELECT  USER_NAME
    ,WAREHOUSE_NAME
    ,DATE_TRUNC('hour',START_TIME) as START_TIME_HOUR
    ,SUM(EXECUTION_TIME)  as USER_HOUR_EXECUTION_TIME
    FROM "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" 
    WHERE WAREHOUSE_NAME IS NOT NULL
    AND EXECUTION_TIME > 0
  
 --Change the below filter if you want to look at a longer range than the last 1 month 
    AND START_TIME > DATEADD(Month,-1,CURRENT_TIMESTAMP())
    group by 1,2,3
    )
, HOUR_EXECUTION_CTE AS (
    SELECT  START_TIME_HOUR
    ,WAREHOUSE_NAME
    ,SUM(USER_HOUR_EXECUTION_TIME) AS HOUR_EXECUTION_TIME
    FROM USER_HOUR_EXECUTION_CTE
    group by 1,2
)
, APPROXIMATE_CREDITS AS (
    SELECT 
    A.USER_NAME
    ,C.WAREHOUSE_NAME
    ,(A.USER_HOUR_EXECUTION_TIME/B.HOUR_EXECUTION_TIME)*C.CREDITS_USED AS APPROXIMATE_CREDITS_USED

    FROM USER_HOUR_EXECUTION_CTE A
    JOIN HOUR_EXECUTION_CTE B  ON A.START_TIME_HOUR = B.START_TIME_HOUR and B.WAREHOUSE_NAME = A.WAREHOUSE_NAME
    JOIN "SNOWFLAKE"."ACCOUNT_USAGE"."WAREHOUSE_METERING_HISTORY" C ON C.WAREHOUSE_NAME = A.WAREHOUSE_NAME AND C.START_TIME = A.START_TIME_HOUR
)

SELECT 
 USER_NAME
,WAREHOUSE_NAME
,SUM(APPROXIMATE_CREDITS_USED) AS APPROXIMATE_CREDITS_USED
FROM APPROXIMATE_CREDITS
GROUP BY 1,2
ORDER BY 3 DESC
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Queries by # of Times Executed and Execution Time (T2)

Tier 2

์„ค๋ช…:

๋งค์šฐ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‚˜์š”?? ์‹คํ–‰ ์‹œ๊ฐ„์„ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋‚˜์š”?

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

ํ…Œ์ด๋ธ”๋กœ ๊ฒฐ๊ณผ ์„ธํŠธ๋ฅผ ๊ตฌ์ฒดํ™”ํ•  ๊ธฐํšŒ์ผ๊นŒ์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

SELECT 
QUERY_TEXT
,count(*) as number_of_queries
,sum(TOTAL_ELAPSED_TIME)/1000 as execution_seconds
,sum(TOTAL_ELAPSED_TIME)/(1000*60) as execution_minutes
,sum(TOTAL_ELAPSED_TIME)/(1000*60*60) as execution_hours

  from SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY Q
  where 1=1
  and TO_DATE(Q.START_TIME) >     DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP())) 
 and TOTAL_ELAPSED_TIME > 0 --only get queries that actually used compute
  group by 1
  having count(*) >= 10 --configurable/minimal threshold
  order by 2 desc
  limit 100 --configurable upper bound threshold
  ;

Top 50 Longest Running Queries (T2)

Tier 2

์„ค๋ช…:

ํŒจํ„ด์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์˜ค๋ž˜ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ 50๊ฐœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์›จ์–ดํ•˜์šฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋˜๋Š” ํ™•์žฅ์œผ๋กœ ์ตœ์ ํ™”ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ๋‚˜์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

select
          
          QUERY_ID
         --reconfigure the url if your account is not in AWS US-West
         ,'https://'||CURRENT_ACCOUNT()||'.snowflakecomputing.com/console#/monitoring/queries/detail?queryId='||Q.QUERY_ID as QUERY_PROFILE_URL
         ,ROW_NUMBER() OVER(ORDER BY PARTITIONS_SCANNED DESC) as QUERY_ID_INT
         ,QUERY_TEXT
         ,TOTAL_ELAPSED_TIME/1000 AS QUERY_EXECUTION_TIME_SECONDS
         ,PARTITIONS_SCANNED
         ,PARTITIONS_TOTAL

from SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY Q
 where 1=1
  and TO_DATE(Q.START_TIME) >     DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP())) 
    and TOTAL_ELAPSED_TIME > 0 --only get queries that actually used compute
    and ERROR_CODE iS NULL
    and PARTITIONS_SCANNED is not null
   
  order by  TOTAL_ELAPSED_TIME desc
   
   LIMIT 50
   ;

Top 50 Queries that Scanned the Most Data (T2)

Tier 2

์„ค๋ช…:

๊ฐ€์žฅ ๋งŽ์€ ๋งˆ์ดํฌ๋กœ ํŒŒํ‹ฐ์…˜์„ ์Šค์บ”ํ•œ ์ƒ์œ„ ์ฟผ๋ฆฌ 50๊ฐœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์›จ์–ดํ•˜์šฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋˜๋Š” ํ™•์žฅ์œผ๋กœ ์ตœ์ ํ™”ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ๋‚˜์š”?

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

select
          
          QUERY_ID
          --reconfigure the url if your account is not in AWS US-West
         ,'https://'||CURRENT_ACCOUNT()||'.snowflakecomputing.com/console#/monitoring/queries/detail?queryId='||Q.QUERY_ID as QUERY_PROFILE_URL
         ,ROW_NUMBER() OVER(ORDER BY PARTITIONS_SCANNED DESC) as QUERY_ID_INT
         ,QUERY_TEXT
         ,TOTAL_ELAPSED_TIME/1000 AS QUERY_EXECUTION_TIME_SECONDS
         ,PARTITIONS_SCANNED
         ,PARTITIONS_TOTAL

from SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY Q
 where 1=1
  and TO_DATE(Q.START_TIME) >     DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP())) 
    and TOTAL_ELAPSED_TIME > 0 --only get queries that actually used compute
    and ERROR_CODE iS NULL
    and PARTITIONS_SCANNED is not null
   
  order by  PARTITIONS_SCANNED desc
   
   LIMIT 50
   ;

Queries by Execution Buckets over the Past 7 Days (T2)

Tier 2

์„ค๋ช…:

์‹คํ–‰ ์‹œ๊ฐ„ ๋ฒ„ํ‚ท๋ณ„๋กœ ์ฃผ์–ด์ง„ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์ฟผ๋ฆฌ SLA ๋™ํ–ฅ์„ ํ™•์ธํ•˜๊ณ  ์›จ์–ดํ•˜์šฐ์Šค ์ถ•์†Œ, ํ™•์žฅ ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์›จ์–ดํ•˜์šฐ์Šค๋กœ ์ผ๋ถ€ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

WITH BUCKETS AS (

SELECT 'Less than 1 second' as execution_time_bucket, 0 as execution_time_lower_bound, 1000 as execution_time_upper_bound
UNION ALL
SELECT '1-5 seconds' as execution_time_bucket, 1000 as execution_time_lower_bound, 5000 as execution_time_upper_bound
UNION ALL
SELECT '5-10 seconds' as execution_time_bucket, 5000 as execution_time_lower_bound, 10000 as execution_time_upper_bound
UNION ALL
SELECT '10-20 seconds' as execution_time_bucket, 10000 as execution_time_lower_bound, 20000 as execution_time_upper_bound
UNION ALL
SELECT '20-30 seconds' as execution_time_bucket, 20000 as execution_time_lower_bound, 30000 as execution_time_upper_bound
UNION ALL
SELECT '30-60 seconds' as execution_time_bucket, 30000 as execution_time_lower_bound, 60000 as execution_time_upper_bound
UNION ALL
SELECT '1-2 minutes' as execution_time_bucket, 60000 as execution_time_lower_bound, 120000 as execution_time_upper_bound
UNION ALL
SELECT 'more than 2 minutes' as execution_time_bucket, 120000 as execution_time_lower_bound, NULL as execution_time_upper_bound
)

SELECT 
 COALESCE(execution_time_bucket,'more than 2 minutes')
,count(Query_ID) as number_of_queries

from SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY Q
FULL OUTER JOIN BUCKETS B ON (Q.TOTAL_ELAPSED_TIME) >= B.execution_time_lower_bound and (Q.TOTAL_ELAPSED_TIME) < B.execution_time_upper_bound
where Q.Query_ID is null
OR (
TO_DATE(Q.START_TIME) >= DATEADD(week,-1,TO_DATE(CURRENT_TIMESTAMP())) 
and warehouse_name = <WAREHOUSE_NAME>
and TOTAL_ELAPSED_TIME > 0 
  )
group by 1,COALESCE(b.execution_time_lower_bound,120000)
order by COALESCE(b.execution_time_lower_bound,120000)
  ;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Warehouses with High Cloud Services Usage (T2)

Tier 2

์„ค๋ช…:

ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค์™€ ์ด ์ปดํ“จํŒ…์˜ ๋น„์œจ๋กœ ์ •๋ ฌ๋œ ์ปดํ“จํŒ…์˜ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ถฉ๋ถ„ํ•œ ์ปดํ“จํŒ…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ์ปดํ“จํŒ…์˜ ๋†’์€ ๋ณผ๋ฅจ๊ณผ ๋น„์œจ์„ ์‚ฌ์šฉํ•˜๋Š” ์›จ์–ดํ•˜์šฐ์Šค์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ „๋ฐ˜์ ์ธ ๋น„์šฉ(๋ณต์ œ, S3์— ์žˆ๋Š” ๋ชฉ๋ก ํŒŒ์ผ, ํŒŒํŠธ๋„ˆ ๋„๊ตฌ ์„ค์ • ์„ธ์…˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋“ฑ์ผ ์ˆ˜ ์žˆ์Œ)์ด ์ค„์–ด๋“œ๋Š” ์ด์œ ๋ฅผ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ํฌ๋ ˆ๋”ง ์†Œ๋น„๋ฅผ ์ค„์ด๋ ค๋Š” ๋ชฉํ‘œ๋Š” ์ „๋ฐ˜์ ์ธ ํฌ๋ ˆ๋”ง์˜ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ํฌ๋ ˆ๋”ง์„ 10% ๋ฏธ๋งŒ์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ####์ฃผ์š” ์Šคํ‚ค๋งˆ: Account_Usage

SQL

select 
    WAREHOUSE_NAME
    ,SUM(CREDITS_USED) as CREDITS_USED
    ,SUM(CREDITS_USED_CLOUD_SERVICES) as CREDITS_USED_CLOUD_SERVICES
    ,SUM(CREDITS_USED_CLOUD_SERVICES)/SUM(CREDITS_USED) as PERCENT_CLOUD_SERVICES
from "SNOWFLAKE"."ACCOUNT_USAGE"."WAREHOUSE_METERING_HISTORY"
where TO_DATE(START_TIME) >= DATEADD(month,-1,CURRENT_TIMESTAMP())
and CREDITS_USED_CLOUD_SERVICES > 0
group by 1
order by 4 desc
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here

Warehouse Utilization (T2)

Tier 2

์„ค๋ช…:

์ด ์ฟผ๋ฆฌ๋Š” ์‹œ๊ฐ„๋‹น ํฌ๋ ˆ๋”ง ์†Œ๋น„์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ”์œ์ง€๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์†Œ๋น„๋œ ํฌ๋ ˆ๋”ง ์ˆ˜, ์‹คํ–‰๋œ ์ฟผ๋ฆฌ ์ˆ˜ ๋ฐ ๊ฐ ์‹œ๊ฐ„ ์ฐฝ์—์„œ ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ์˜ ์ด ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ํ•ด์„ ๋ฐฉ๋ฒ•:

์ด ๋ฐ์ดํ„ฐ๋Š” ํฌ๋ ˆ๋”ง ์†Œ๋น„์™€ #/์ฟผ๋ฆฌ ์‹คํ–‰ ๊ธฐ๊ฐ„ ๊ฐ„์˜ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ๋„์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ ์€ ํฌ๋ ˆ๋”ง ์ˆ˜๋ฅผ ์œ„ํ•œ ๋” ๋งŽ์€ ์ฟผ๋ฆฌ ๋˜๋Š” ๋” ๋†’์€ ์ฟผ๋ฆฌ ๊ธฐ๊ฐ„์€ ํฌ๋ ˆ๋”ง๋ณ„๋กœ ๋” ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ๋„์ถœํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ์Šคํ‚ค๋งˆ:

Account_Usage

SQL

SELECT
       WMH.WAREHOUSE_NAME
      ,WMH.START_TIME
      ,WMH.CREDITS_USED
      ,SUM(COALESCE(B.EXECUTION_TIME_SECONDS,0)) as TOTAL_EXECUTION_TIME_SECONDS
      ,SUM(COALESCE(QUERY_COUNT,0)) AS QUERY_COUNT

FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY WMH
LEFT JOIN (

      --QUERIES FULLY EXECUTED WITHIN THE HOUR
      SELECT
         WMH.WAREHOUSE_NAME
        ,WMH.START_TIME
        ,SUM(COALESCE(QH.EXECUTION_TIME,0))/(1000) AS EXECUTION_TIME_SECONDS
        ,COUNT(DISTINCT QH.QUERY_ID) AS QUERY_COUNT
      FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY     WMH
      JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY             QH ON QH.WAREHOUSE_NAME = WMH.WAREHOUSE_NAME
                                                                          AND QH.START_TIME BETWEEN WMH.START_TIME AND WMH.END_TIME
                                                                          AND QH.END_TIME BETWEEN WMH.START_TIME AND WMH.END_TIME
      WHERE TO_DATE(WMH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      AND TO_DATE(QH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      GROUP BY
      WMH.WAREHOUSE_NAME
      ,WMH.START_TIME

      UNION ALL

      --FRONT part OF QUERIES Executed longer than 1 Hour
      SELECT
         WMH.WAREHOUSE_NAME
        ,WMH.START_TIME
        ,SUM(COALESCE(DATEDIFF(seconds,QH.START_TIME,WMH.END_TIME),0)) AS EXECUTION_TIME_SECONDS
        ,COUNT(DISTINCT QUERY_ID) AS QUERY_COUNT
      FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY     WMH
      JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY             QH ON QH.WAREHOUSE_NAME = WMH.WAREHOUSE_NAME
                                                                          AND QH.START_TIME BETWEEN WMH.START_TIME AND WMH.END_TIME
                                                                          AND QH.END_TIME > WMH.END_TIME
      WHERE TO_DATE(WMH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      AND TO_DATE(QH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      GROUP BY
      WMH.WAREHOUSE_NAME
      ,WMH.START_TIME

      UNION ALL

      --Back part OF QUERIES Executed longer than 1 Hour
      SELECT
         WMH.WAREHOUSE_NAME
        ,WMH.START_TIME
        ,SUM(COALESCE(DATEDIFF(seconds,WMH.START_TIME,QH.END_TIME),0)) AS EXECUTION_TIME_SECONDS
        ,COUNT(DISTINCT QUERY_ID) AS QUERY_COUNT
      FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY     WMH
      JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY             QH ON QH.WAREHOUSE_NAME = WMH.WAREHOUSE_NAME
                                                                          AND QH.END_TIME BETWEEN WMH.START_TIME AND WMH.END_TIME
                                                                          AND QH.START_TIME < WMH.START_TIME
      WHERE TO_DATE(WMH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      AND TO_DATE(QH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      GROUP BY
      WMH.WAREHOUSE_NAME
      ,WMH.START_TIME

      UNION ALL

      --Middle part OF QUERIES Executed longer than 1 Hour
      SELECT
         WMH.WAREHOUSE_NAME
        ,WMH.START_TIME
        ,SUM(COALESCE(DATEDIFF(seconds,WMH.START_TIME,WMH.END_TIME),0)) AS EXECUTION_TIME_SECONDS
        ,COUNT(DISTINCT QUERY_ID) AS QUERY_COUNT
      FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY     WMH
      JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY             QH ON QH.WAREHOUSE_NAME = WMH.WAREHOUSE_NAME
                                                                          AND WMH.START_TIME > QH.START_TIME
                                                                          AND WMH.END_TIME < QH.END_TIME
      WHERE TO_DATE(WMH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      AND TO_DATE(QH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
      GROUP BY
      WMH.WAREHOUSE_NAME
      ,WMH.START_TIME

) B ON B.WAREHOUSE_NAME = WMH.WAREHOUSE_NAME AND B.START_TIME = WMH.START_TIME

WHERE TO_DATE(WMH.START_TIME) >= DATEADD(week,-1,CURRENT_TIMESTAMP())
GROUP BY

      WMH.WAREHOUSE_NAME
      ,WMH.START_TIME
      ,WMH.CREDITS_USED
;

์Šคํฌ๋ฆฐ์ƒท

alt-tlext-here
Updated 2023๋…„ 2์›” 25์ผ

This content is provided as is, and is not maintained on an ongoing basis. It may be out of date with current Snowflake instances