Attribution des coûts

Une organisation peut se faire une idée du coût d’utilisation de Snowflake en attribuant ces coûts à des unités logiques au sein de l’organisation (par exemple, des départements, des environnements et des projets). Ce modèle de rétrofacturation (chargeback) ou de récupération des données de facturation (showback) est utile à des fins comptables, mais il permet également à une organisation d’identifier les unités qui dépensent le plus. Ces informations permettent d’identifier les secteurs de l’organisation qui pourraient bénéficier de contrôles et d’optimisations afin de réduire les coûts.

Dans ce chapitre :

Vue d’ensemble

Snowflake offre un ensemble flexible de fonctions d’attribution des coûts qui permettent aux organisations d’attribuer des coûts à n’importe quel niveau de la hiérarchie des objets Snowflake. Ces fonctionnalités permettent d’attribuer la consommation de crédits à des groupements tels que les centres de coûts, les environnements et les projets. Snowflake propose les stratégies d’attribution suivantes :

  • Le balisage d’objets peut fournir une attribution granulaire qui vous permet d’affecter le coût d’utilisation de ressources individuelles telles qu’un entrepôt ou une base de données à une unité spécifique au sein de l’organisation.

  • L’exécution des requêtes permet d’attribuer l’utilisation de l’entrepôt par rôle, utilisateur ou requête, ce qui est particulièrement utile lorsque plusieurs centres de coûts partagent le même entrepôt.

Coût des attributs des ressources individuelles

Le moyen le plus direct et le plus puissant d’attribuer un coût à différents groupes tels que des départements, des environnements ou des projets consiste à baliser des ressources spécifiques à l’aide de la fonction de balisage d’objets. Dans cette stratégie, un administrateur crée une balise (par exemple, cost_center), puis définit une liste de valeurs possibles de la balise (par exemple, sales, finance). Dans cet exemple, chaque centre de coûts reçoit une valeur de balise unique. La combinaison balise/valeur est ensuite affectée aux ressources utilisées par un centre de coûts. Comme ces ressources consomment des crédits, vous pouvez exécuter des rapports groupés par la valeur de la balise. Comme cette valeur de balise correspond directement à un groupement particulier au sein de l’organisation, les coûts peuvent être attribués avec précision.

Le balisage d’objets vous permet d’attribuer un coût en fonction d’un élément aussi général qu’un compte ou aussi spécifique qu’un tableau. Notez que tous les objets qu’il est possible de baliser n’accumulent pas de coût. Du point de vue de la gestion des coûts, le balisage d’un objet n’a de sens que s’il existe une vue du schéma qui contient des données d’utilisation ou de coût liées à cet objet. Pour une liste des vues de l’utilisation et des coûts de Snowflake, voir Explorer le coût global.

Flux de travail d’attribution

L’utilisation de balises d’objet pour attribuer un coût consiste en trois tâches de base :

  1. Concevoir une stratégie de balisage et créer les balises appropriées.

  2. Marquer les ressources avec la bonne paire balise/valeur.

  3. Exécuter des rapports basés sur les données d’utilisation et de balisage.

Pour illustrer ce flux de travail, considérons un compte Snowflake qui :

  • A deux centres de coûts : les ventes et les finances.

  • Possède trois entrepôts. Les ventes utilisent Entrepôt1 et Entrepôt2, tandis que le service financier utilise Entrepôt3.

Three warehouses in an account

Dans cet exemple, l’objectif est d’attribuer les coûts associés à chaque entrepôt au département approprié.

Note

L’exemple suivant suppose que les privilèges appropriés ont été accordés au rôle tag_admin. Une organisation peut utiliser les autorisations de balisage granulaires pour développer une stratégie de balisage sécurisée.

Tâche 1 : concevoir une stratégie de balisage et créer les balises appropriées

Dans cet exemple, un administrateur disposant des privilèges appropriés crée une seule balise appelée cost_center.

use role tag_admin;
use schema my_db.my_schema;
create tag cost_center;
Copy
Tâche 2 : baliser les objets avec la bonne paire balise/valeur

L’administrateur des balises applique la paire balise/valeur appropriée aux entrepôts. Par exemple, comme le département des ventes utilise à la fois warehouse1 et warehouse2, la même combinaison balise/valeur est appliquée à ces deux ressources.

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

Note

Si les administrateurs veulent contrôler les valeurs qui peuvent être définies sur l’objet, ils peuvent utiliser le paramètre facultatif allowed_values lors de la création de la balise. Pour plus de détails, voir CREATE TAG.

Tâche 3 : exécuter des rapports basés sur les données d’utilisation et de balisage.

Vous pouvez attribuer des coûts en rendant compte de l’utilisation des ressources qui ont la balise cost_center. Ces données sont disponibles dans Snowsight, the Snowflake web interface, ou en interrogeant le schéma SNOWFLAKE.ACCOUNT_USAGE.

Snowsight
  1. Passer à un rôle qui a accès au schéma ACCOUNT_USAGE.

  2. Accédez à Admin » Usage.

  3. Dans la liste déroulante Tags, sélectionnez la balise cost_center.

  4. Pour se concentrer sur un centre de coûts spécifique, sélectionnez une valeur dans la liste des valeurs de la balise.

  5. Cliquez sur Apply.

Pour plus de détails sur le filtrage dans Snowsight, voir Filtrer par balise.

SQL

Le schéma Account Usage contient des données concernant à la fois l’utilisation des ressources et les balises du schéma. L’exécution d’une requête sur les vues de ce schéma attribue la consommation de crédit par les entrepôts au centre de coût approprié.

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

La requête renvoie un rapport comme ce qui suit :

COST_CENTER

CREDITS_USED

SALES

17,173333333

FINANCE

8,14444444

Pour plus de détails sur l’utilisation des balises d’objet, voir Balisage d’objets.

Coût des attributs pour un entrepôt partagé

Dans certains scénarios, un entrepôt est partagé entre plusieurs équipes, et il est nécessaire de répartir le coût de l’entrepôt entre les équipes. Il existe trois façons de séparer les coûts : par utilisateur, par rôle, ou par une balise de requête personnalisée. Chacune d’entre elles est brièvement présentée, suivie de la requête utilisée pour générer un rapport pour chaque approche.

Par utilisateur

Chaque requête exécutée dans un entrepôt virtuel est associée à l’utilisateur qui l’a exécutée. Ces données sont disponibles dans la colonne USER_NAME du Vue QUERY_HISTORY. Vous pouvez joindre ces données aux données d’utilisation dans la vue WAREHOUSE_METERING_HISTORY pour ventiler les coûts de l’entrepôt par utilisateur.

Par exemple, si vous modifiez la requête sous pour inclure USER_NAME, le rapport pourrait ressembler à ceci :

USER_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

JOHN

WAREHOUSE1

11,255295833

SALLY

WAREHOUSE1

3,79444444

JOHN

WAREHOUSE2

1,636703054

Par rôle

Chaque requête exécutée dans un entrepôt virtuel est associée au rôle qui l’exécute. Ces données sont disponibles dans la colonne ROLE_NAME du Vue QUERY_HISTORY. Chaque utilisateur de Snowflake a au moins un rôle.

En associant le rôle de la requête de la vue QUERY_HISTORY aux données d’utilisation de la vue WAREHOUSE_METERING_HISTORY, l’administrateur des coûts peut ventiler les coûts de l’entrepôt par rôle.

Par exemple, si vous modifiez la requête sous pour inclure ROLE_NAME, le rapport pourrait ressembler à ceci :

ROLE_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_ADMIN

WAREHOUSE1

17,20239833

DEV_ADMIN

WAREHOUSE1

5,7990244

SALES_ADMIN

WAREHOUSE2

1,49765448

Par balise de requête

Lorsque plusieurs applications partagent le même nom d’utilisateur et le même entrepôt, le paramètre de session QUERY_TAG peut aider à répartir le coût entre les applications. Ce paramètre de session applique une balise aux requêtes et autres instructions SQL exécutées dans une session.

Pour utiliser cette stratégie d’attribution, il faut d’abord définir QUERY_TAG de la session. Par exemple :

ALTER SESSION SET QUERY_TAG = 'APP1'
Copy

Une fois que ce paramètre est défini pour la session, chaque requête exécutée pendant la session est stockée dans le Vue QUERY_HISTORY avec la balise de requête APP1.

Pour exécuter un rapport sur les coûts associés à des balises de requête particulières, modifiez la requête sous pour inclure QUERY_TAG. Le résultat pourrait ressembler à ceci :

QUERY_TAG

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_APP

WAREHOUSE1

14,3027235

DEV_APP

WAREHOUSE1

11,2938568

SALES_APP

WAREHOUSE2

9,235620

Requête : répartissez l’utilisation de l’entrepôt par utilisateur, rôle ou balise de requête.

Vous pouvez utiliser une requête pour générer un rapport qui répartit les coûts de l’entrepôt partagé par utilisateur, par rôle ou par balise de requête. Cette requête est fondamentalement la même, quelle que soit la façon dont les coûts sont séparés. Il associe les métadonnées de requête de Vue QUERY_HISTORY aux données d’utilisation de Vue WAREHOUSE_METERING_HISTORY pour décomposer les coûts de l’entrepôt du mois dernier.

Pour générer un rapport, ajustez la requête suivante en modifiant les instructions SELECT pour projeter la colonne appropriée de la vue QUERY_HISTORY. Par exemple, si vous attribuez les coûts de l’entrepôt à différents rôles, spécifiez la colonne ROLE_NAME.

-- Replace <query_metadata> with USER_NAME, ROLE_NAME, or QUERY_TAG

WITH HOUR_EXECUTION_TIME_CTE AS (
    SELECT <query_metadata>
      ,WAREHOUSE_NAME
      ,DATE_TRUNC('hour',START_TIME) as START_TIME_HOUR
      ,SUM(EXECUTION_TIME)  as 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_TOTAL_CTE AS (
    SELECT START_TIME_HOUR
      ,WAREHOUSE_NAME
      ,SUM(HOUR_EXECUTION_TIME) AS HOUR_EXECUTION_TOTAL
    FROM HOUR_EXECUTION_TIME_CTE
    group by 1,2
)
, HOUR_APPROXIMATE_CREDITS_USED AS (
    SELECT
      A.<query_metadata>
      ,C.WAREHOUSE_NAME
      ,(A.HOUR_EXECUTION_TIME/B.HOUR_EXECUTION_TOTAL)*C.CREDITS_USED AS HOUR_APPROXIMATE_CREDITS_USED

    FROM HOUR_EXECUTION_TIME_CTE A
    JOIN HOUR_EXECUTION_TOTAL_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
  <query_metadata>
  , WAREHOUSE_NAME
  ,SUM(HOUR_APPROXIMATE_CREDITS_USED) AS APPROXIMATE_CREDITS_USED
FROM HOUR_APPROXIMATE_CREDITS_USED
GROUP BY 1, 2
ORDER BY 3 DESC
;
Copy