비용 귀속

조직에서는 그와 같은 비용을 조직 내의 논리 단위(예: 부서, 환경, 프로젝트)로 돌려 Snowflake를 사용하는 비용에 대한 인사이트를 얻을 수 있습니다. 이 차지백 또는 쇼백 모델은 회계 목적으로 유용하지만, 이 모델을 통해 조직에서 가장 많은 비용을 지출하는 단위를 식별할 수도 있습니다. 이러한 인사이트는 조직에서 비용 절감을 위한 제어와 최적화로부터 이익을 얻을 수 있는 영역을 정확히 파악하는 데 도움이 됩니다.

개별 리소스의 비용 귀속

부서, 환경 또는 프로젝트와 같은 다양한 그룹화에 비용을 귀속시키는 가장 직접적이고 강력한 방법은 오브젝트 태깅 기능을 사용하여 특정 리소스에 태그를 지정하는 것입니다. 이 전략에서는 관리자가 태그(예: cost_center)를 만든 다음 태그의 가능한 값 목록(예: sales, finance)을 정의합니다. 이 예제에서 각 비용 센터는 고유한 태그 값을 받습니다. 그러면 태그/값 조합이 비용 센터에서 사용하는 리소스에 할당됩니다. 이러한 리소스는 크레딧을 사용하므로 태그 값을 기준으로 분류된 보고서를 실행할 수 있습니다. 이 태그 값은 조직 내의 특정 그룹화에 직접적으로 대응하므로, 비용의 출처를 정확하게 귀속시킬 수 있습니다.

오브젝트 태깅을 사용하면 계정과 같은 일반적인 항목이나 테이블과 같은 구체적인 항목을 기반으로 비용의 귀속시킬 수 있습니다. 태그 가능 오브젝트 가 전부 비용을 누적하는 것은 아닙니다. 비용 관리 관점에서, 오브젝트에 태그를 지정하는 것은 해당 오브젝트와 관련된 사용량 또는 비용 데이터가 포함된 스키마 뷰가 있는 경우에만 타당합니다. Snowflake 사용량 및 비용 뷰 목록은 전체 비용 살펴보기 섹션을 참조하십시오.

귀속 워크플로

오브젝트 태그를 사용하여 비용을 귀속시키는 것은 세 가지 기본 작업으로 구성됩니다.

  1. 태깅 전략을 설계하고 적절한 태그를 만듭니다.

  2. 올바른 태그/값 페어로 리소스에 태그를 지정합니다.

  3. 사용량 및 태그 데이터를 기반으로 보고서를 실행합니다.

이 워크플로를 설명하는 데 도움이 되도록 다음과 같은 Snowflake 계정을 고려하십시오.

  • 영업 및 재무라는 두 가지 비용 센터가 있는 계정.

  • 세 개의 웨어하우스가 있는 계정. 영업 부서에서는 Warehouse1과 Warehouse2를 사용하고 재무 부서에서는 Warehouse3를 사용합니다.

한 계정에 3개의 웨어하우스

이 예제에서는 각 웨어하우스와 관련된 웨어하우스 비용을 알맞은 부서에 귀속시키는 것이 목표입니다.

참고

다음 예제에서는 tag_admin 역할에 알맞은 권한이 부여되었다고 가정합니다. 조직에서는 세분화된 태깅 권한 을 사용하여 안전한 태깅 전략을 개발할 수 있습니다.

작업 1: 태깅 전략 설계 및 알맞은 태그 만들기

이 예제의 경우, 적절한 권한이 있는 관리자가 cost_center 라는 단일 태그를 만듭니다.

USE ROLE tag_admin;
USE SCHEMA my_db.my_schema;
CREATE TAG cost_center;
Copy
작업 2: 올바른 태그/값 페어로 오브젝트에 태그 지정

태그 관리자는 적절한 태그/값 페어를 웨어하우스에 적용합니다. 예를 들어 영업 부서에서 warehouse1warehouse2 를 모두 사용하므로, 동일한 태그/값 조합이 이 두 리소스에 적용됩니다.

USE ROLE tag_admin;
ALTER WAREHOUSE warehouse1 SET TAG cost_center='SALES';
ALTER WAREHOUSE warehouse2 SET TAG cost_center='SALES';
ALTER WAREHOUSE warehouse3 SET TAG cost_center='FINANCE';
Copy

참고

관리자가 오브젝트에 설정할 수 있는 값을 제어하려는 경우, 태그를 만들 때 선택적 allowed_values 매개 변수를 사용할 수 있습니다. 자세한 내용은 CREATE TAG 섹션을 참조하십시오.

작업 3: 사용량 및 태그 데이터를 기반으로 보고서 실행

cost_center 태그가 있는 리소스 사용에 관해 보고하여 비용의 출처를 밝힐 수 있습니다. 이 데이터는 Snowsight 에서 구하거나 SNOWFLAKE.ACCOUNT_USAGE 스키마를 쿼리하여 구할 수 있습니다.

Snowsight:
  1. ACCOUNT_USAGE 스키마에 대한 액세스 권한 이 있는 역할로 전환합니다.

  2. Admin » Cost Management 으로 이동합니다.

  3. Consumption 을 선택합니다.

  4. Tags 드롭다운에서 cost_center 태그를 선택합니다.

  5. 특정 비용 센터에 초점을 맞추려면 태그 값 목록에서 값을 선택하십시오.

  6. Apply 를 선택합니다.

Snowsight 에서의 필터링에 대한 자세한 내용은 태그로 필터링하기 섹션을 참조하십시오

SQL:

Account Usage 스키마는 리소스 사용량과 스키마의 태그에 대한 데이터를 모두 포함합니다. 이 스키마의 뷰에 대해 쿼리를 실행하면 웨어하우스의 크레딧 사용이 올바른 비용 센터에 귀속됩니다.

USE snowflake.account_usage;

SELECT tag_value AS cost_center,
  SUM(credits_used)
FROM warehouse_metering_history, tag_references
WHERE warehouse_name=object_name
  AND tag_name='COST_CENTER'
GROUP BY 1
ORDER BY 2 DESC;
Copy

이 쿼리는 다음과 같은 보고서를 반환합니다.

COST_CENTER

CREDITS_USED

SALES

17.173333333

FINANCE

8.14444444

특정 월의 모든 웨어하우스에 대한 비용 기여도를 태그 및 태그 값과 함께 볼 수 있습니다. 이 쿼리는 태그가 지정되지 않은 웨어하우스도 식별합니다.

SELECT tag_references.tag_name,
     COALESCE(tag_references.tag_value, 'untagged') AS tag_value,
     SUM(warehouse_metering_history.credits_used_compute) AS total_credits
FROM snowflake.account_usage.warehouse_metering_history
LEFT JOIN snowflake.account_usage.tag_references
ON warehouse_metering_history.warehouse_id = tag_references.object_id
WHERE warehouse_metering_history.start_time >= DATE_TRUNC('MONTH', DATEADD(MONTH, -1, CURRENT_DATE))
  AND warehouse_metering_history.start_time < DATE_TRUNC('MONTH',  CURRENT_DATE)
GROUP BY tag_references.tag_name, COALESCE(tag_references.tag_value, 'untagged')
ORDER BY total_credits DESC;
Copy
+-------------+-------------+-----------------+
| TAG_NAME    | TAG_VALUE   |   TOTAL_CREDITS |
|-------------+-------------+-----------------|
| NULL        | untagged    |    20.360277159 |
| COST_CENTER | Sales       |    17.173333333 |
| COST_CENTER | Finance     |      8.14444444 |
+-------------+-------------+-----------------+

오브젝트 태그 사용에 대한 자세한 내용은 오브젝트 태그 지정 섹션을 참조하십시오.

쿼리 비용 특성

QUERY_ATTRIBUTION_HISTORY 뷰 를 사용하여 쿼리를 기반으로 비용 특성을 구할 수 있습니다. 쿼리당 비용은 쿼리를 실행하는 데 사용된 웨어하우스 크레딧입니다. 이 비용에는 쿼리 실행으로 인해 발생하는 다른 크레딧 사용은 포함되지 않습니다. 예를 들어, 다음은 쿼리 비용에 포함되지 않습니다.

  • 데이터 전송 비용

  • 저장소 비용

  • 클라우드 서비스 비용

  • 서버리스 기능 비용

  • AI 서비스에서 처리하는 토큰에 대한 비용

동시 실행 쿼리의 경우, 웨어하우스의 비용은 주어진 시간 간격 동안 리소스 소비량의 가중 평균을 기준으로 개별 쿼리의 특성에 따라 결정됩니다.

쿼리당 비용에는 웨어하우스의 유휴 시간 이 포함되지 않습니다. 유휴 시간이란 웨어하우스에서 쿼리가 실행되지 않는 기간으로, 웨어하우스 수준에서 측정할 수 있습니다.

태그, 사용자 및 쿼리별 비용 특성

태그, 사용자 또는 쿼리(예: 반복 쿼리)별로 웨어하우스 및 쿼리 비용의 특성을 구할 수 있습니다.

쿼리 태그를 기반으로 한 웨어하우스 비용 특성

QUERY_TAG 매개 변수를 사용하여 다양한 워크로드에 비용을 할당할 수 있습니다. 쿼리 태그는 작업 부하나 쿼리 세트에 대해 세션 수준에서 할당될 수 있습니다. 태그 기반 속성에 대한 자세한 내용은 기여 워크플로 섹션을 참조하십시오.

세션에 대한 쿼리 태그를 설정하려면 다음 단계를 따릅니다.

  1. 태그를 생성합니다. 예를 들어, 재무팀에 대한 태그를 생성합니다.

    CREATE TAG finance;
    
    Copy
  2. 현재 세션에 대한 쿼리 태그를 설정합니다.

    ALTER SESSION SET query_tag = finance;
    
    Copy

    finance 태그는 세션 동안 실행되는 모든 쿼리와 연결됩니다.

  3. 현재 월에 대한 모든 태그가 지정된 쿼리의 웨어하우스 비용을 보려면 다음 문을 실행합니다. 이 쿼리는 조정을 위해 태그 전체에 걸쳐 전체 웨어하우스 컴퓨팅 비용(유휴 시간 포함)을 할당합니다.

    WITH wh_bill AS (
       SELECT SUM(credits_used_compute) AS compute_credits
         FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
         WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
         AND start_time < CURRENT_DATE
    ),
    tag_credits AS (
       SELECT COALESCE(NULLIF(query_tag, ''), 'untagged') AS tag,
              SUM(credits_attributed_compute) AS credits
         FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
         WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
         AND start_time < CURRENT_DATE
         GROUP BY tag
    ),
    total_credit AS (
       SELECT SUM(credits) AS sum_all_credits
         FROM tag_credits
    )
    SELECT tc.tag,
           tc.credits / t.sum_all_credits * w.compute_credits AS attributed_credits
      FROM tag_credits tc, total_credit t, wh_bill w;
    
    Copy

웨어하우스 비용의 사용자 기반 특성

사용자별로 웨어하우스 비용 특성을 구할 수 있습니다. 예를 들어, 이번 달의 각 사용자별 총 웨어하우스 비용을 확인하려면 다음 문을 실행합니다.

WITH wh_bill AS (
   SELECT SUM(credits_used_compute) AS compute_credits
     FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
     WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
     AND start_time < CURRENT_DATE
),
user_credits AS (
   SELECT user_name, SUM(credits_attributed_compute) AS credits
     FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
     WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
     AND start_time < CURRENT_DATE
     GROUP BY user_name
),
total_credit AS (
   SELECT SUM(credits) AS sum_all_credits
     FROM user_credits
)
SELECT u.user_name,
       u.credits / t.sum_all_credits * w.compute_credits AS attributed_credits
  FROM user_credits u, total_credit t, wh_bill w
  ORDER BY attributed_credits DESC;
Copy
+-----------+--------------------+
| USER_NAME | ATTRIBUTED_CREDITS |
|-----------+--------------------|
| JSMITH    |       17.173333333 |
|-----------+--------------------|
| MJONES    |         8.14444444 |
|-----------+--------------------|
| SYSTEM    |         5.33985393 |
+-----------+--------------------+

반복 쿼리의 쿼리 비용

반복되거나 유사한 쿼리의 경우 query_hash 또는 query_parameterized_hash 를 사용하여 쿼리별로 비용을 그룹화합니다.

이번 달에 가장 비용이 많이 드는 반복 쿼리를 찾으려면 다음 문을 실행합니다.

SELECT query_parameterized_hash,
       COUNT(*) AS query_count,
       SUM(credits_attributed_compute) AS total_credits
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
  AND start_time < CURRENT_DATE
  GROUP BY query_parameterized_hash
  ORDER BY total_credits DESC
  LIMIT 20;
Copy

쿼리 ID에 기반한 추가 쿼리는 섹션을 참조하십시오.

계층적 쿼리의 쿼리 비용

여러 계층 쿼리를 실행하는 저장 프로시저의 경우 프로시저에 대한 루트 쿼리 ID를 사용하여 프로시저의 각 쿼리 비용을 계산할 수 있습니다.

  1. 저장 프로시저에 대한 루트 쿼리 ID를 찾으려면 ACCESS_HISTORY 뷰 을 사용합니다. 예를 들어, 저장 프로시저에 대한 루트 쿼리 ID를 찾으려면 query_id 를 설정하고 다음 문을 실행합니다.

    SET query_id = '<query_id>';
    
    SELECT query_id,
           parent_query_id,
           root_query_id,
           direct_objects_accessed
      FROM SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY
      WHERE query_id = $query_id;
    
    Copy

    자세한 내용은 예: 저장 프로시저를 사용한 상위 쿼리 섹션을 참조하십시오.

  2. 전체 프로시저의 쿼리 비용을 합산하려면 <root_query_id> 를 바꾸고 다음 문을 실행합니다.

    SET query_id = '<root_query_id>';
    
    SELECT SUM(credits_attributed_compute) AS total_attributed_credits
      FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
      WHERE (root_query_id = $query_id OR query_id = $query_id);
    
    Copy