Zuordnen von Kosten

Eine Organisation kann einen Einblick in die Kosten für die Nutzung von Snowflake gewinnen, indem sie diese Kosten logischen Einheiten innerhalb der Organisation zuordnet (z. B. Abteilungen, Umgebungen und Projekten). Dieses Chargeback- oder Showback-Modell ist für Buchhaltungszwecke nützlich, ermöglicht es einer Organisation aber auch festzustellen, welche Einheiten die höchsten Ausgaben haben. Diese Erkenntnisse helfen dabei, Bereiche im Unternehmen zu identifizieren, die von Kontrollelementen und Optimierungen profitieren könnten, um die Kosten zu senken.

Unter diesem Thema:

Übersicht

Snowflake bietet einen flexiblen Satz von Features zur Kostenzuordnung, mit denen Unternehmen Kosten auf jeder Ebene der Snowflake-Objekthierarchie zuordnen können. Diese Features können den Credit-Verbrauch Gruppierungen wie Kostenstellen, Umgebungen und Projekten zuordnen. Snowflake bietet die folgenden Zuordnungsstrategien:

  • Objekt-Tagging kann eine granulare Zuordnung ermöglichen, mit der Sie die Kosten für die Nutzung einzelner Ressourcen wie eines Warehouses oder einer Datenbank einer bestimmten Einheit innerhalb der Organisation zuordnen können.

  • Das Ausführen von Abfragen kann die Warehouse-Nutzung Rollen, Benutzern oder Abfragen zuordnen, was besonders hilfreich ist, wenn mehrere Kostenstellen dasselbe Warehouse nutzen.

Kosten einzelnen Ressourcen zuordnen

Die direkteste und leistungsfähigste Methode, Kosten verschiedenen Gruppierungen wie Abteilungen, Umgebungen oder Projekten zuzuordnen, ist das Kennzeichnen bestimmter Ressourcen mithilfe des Features Objekt-Tagging. Bei dieser Strategie erstellt ein Administrator ein Tag (z. B. cost_center) und definiert dann eine Liste möglicher Werte für das Tag (z. B. sales, finance). In diesem Beispiel erhält jede Kostenstelle einen eindeutigen Tag-Wert. Die Tag/Wert-Kombination wird dann den von einer Kostenstelle verwendeten Ressourcen zugeordnet. Da diese Ressourcen Credits verbrauchen, können Sie Berichte gruppiert nach dem Tag-Wert erstellen. Da dieser Tag-Wert direkt einer bestimmten Gruppierung innerhalb der Organisation entspricht, lassen sich die Kosten genau zuordnen.

Mithilfe des Objekt-Taggings können Sie Kosten auf Basis allgemeiner Elemente wie einem Konto oder spezifischer Elemente wie einer Tabelle zuordnen. Beachten Sie, dass nicht alle Tagging-fähigen Objekte Kosten akkumulieren. Aus Sicht des Kostenmanagements ist das Tagging eines Objekts nur dann sinnvoll, wenn es eine Schemaansicht gibt, die Nutzungs- oder Kostendaten zu diesem Objekt enthält. Eine Liste der Snowflake-Ansichten, die Nutzungs- und Kostendaten enthalten, finden Sie unter Untersuchen der Gesamtkosten.

Zuordnungs-Workflow

Das Verwenden von Objekt-Tags zur Zuordnung von Kosten besteht aus drei grundlegenden Aufgaben:

  1. Entwerfen einer Tagging-Strategie und Erstellen der entsprechenden Tags

  2. Zuordnen der korrekten Tag/Wert-Paare zu den entsprechenden Ressourcen

  3. Ausführen der Berichterstellung auf Basis der Nutzungs- und Tag-Daten

Zur Veranschaulichung dieses Workflows betrachten wir ein Snowflake-Konto mit folgenden Eigenschaften:

  • Hat zwei Kostenstellen: Vertrieb (Sales) und Finanzen (Finance).

  • Hat drei Warehouses. Der Vertrieb verwendet Warehouse1 und Warehouse2, die Finanzabteilung verwendet Warehouse3.

Three warehouses in an account

In diesem Beispiel besteht das Ziel darin, die mit jedem Warehouse verbundenen Warehouse-Kosten den entsprechenden Abteilungen zuzuordnen.

Bemerkung

Im folgenden Beispiel wird davon ausgegangen, dass der Rolle tag_admin die entsprechenden Berechtigungen erteilt wurden. Eine Organisation kann die detaillierten Tagging-Berechtigungen nutzen, um eine sichere Tagging-Strategie zu entwickeln.

Aufgabe 1: Entwerfen einer Tagging-Strategie und Erstellen der entsprechenden Tags

In diesem Beispiel erstellt ein Administrator mit den entsprechenden Berechtigungen ein einzelnes Tag namens cost_center (Kostenstelle).

USE ROLE tag_admin;
USE SCHEMA my_db.my_schema;
CREATE TAG cost_center;
Copy
Aufgabe 2: Taggen von Objekten mit den korrekten Tag/Wert-Paaren

Der Tag-Administrator ordnet den Warehouses das entsprechende Tag/Wert-Paar zu. Da beispielsweise die Vertriebsabteilung sowohl warehouse1 als auch warehouse2 verwendet, wird auf diese beiden Ressourcen dieselbe Tag/Wert-Kombination angewendet.

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

Bemerkung

Wenn Administratoren steuern möchten, welche Werte für das Objekt festgelegt werden können, können sie beim Erstellen des Tags den optionalen Parameter allowed_values (zulässige Werte) verwenden. Weitere Details dazu finden Sie unter CREATE TAG.

Aufgabe 3: Ausführen der Berichterstellung auf Basis der Nutzungs- und Tag-Daten

Sie können Kosten zuordnen, indem Sie Berichte über die Verwendung von Ressourcen erstellen, die das cost_center-Tag aufweisen. Diese Daten sind in Snowsight, the Snowflake web interface verfügbar oder können über das Schema SNOWFLAKE.ACCOUNT_USAGE abgefragt werden.

Snowsight
  1. Wechseln Sie zu einer Rolle, die Zugriff auf das ACCOUNT_USAGE-Schema hat.

  2. Navigieren Sie zu Admin » Usage.

  3. Wählen Sie in der Dropdown-Liste Tags das Tag cost_center aus.

  4. Um sich auf eine bestimmte Kostenstelle zu fokussieren, wählen Sie einen Wert aus der Liste der Werte des Tags aus.

  5. Klicken Sie auf Apply.

Weitere Informationen zum Filtern in Snowsight finden Sie unter Nach Tag filtern.

SQL

Das Account Usage-Schema enthält Daten sowohl zur Ressourcennutzung als auch zu den Tags des Schemas. Beim Ausführen einer Abfrage auf Ansichten dieses Schemas wird der Credit-Verbrauch jedes Warehouses der entsprechenden Kostenstelle zugeordnet.

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

Die Abfrage gibt einen Bericht wie den folgenden zurück:

COST_CENTER

CREDITS_USED

SALES

17,173333333

FINANCE

8,14444444

Ausführliche Informationen zur Verwendung von Objekt-Tags finden Sie unter Objekt-Tagging.

Kosten eines freigegebenen Warehouses zuordnen

In bestimmten Szenarios wird ein Warehouse von mehreren Teams gemeinsam genutzt, und es ist notwendig, die Warehouse-Kosten auf die Teams aufzuteilen. Es gibt drei Möglichkeiten, die Kosten zu trennen: nach Benutzer, nach Rolle oder nach einem kundenspezifischen Abfrage-Tag. Jeder dieser Ansätze wird kurz erläutert, gefolgt von der Abfrage, die zum Erstellen eines entsprechenden Berichts verwendet wird.

Nach Benutzer

Jede Abfrage, die in einem virtuellen Warehouse ausgeführt wird, ist mit dem Benutzer verbunden, der die Abfrage ausgeführt hat. Diese Daten sind in der Spalte USER_NAME der QUERY_HISTORY-Ansicht verfügbar. Sie können diese Daten mit den Nutzungsdaten der Ansicht WAREHOUSE_METERING_HISTORY verknüpfen, um die Warehouse-Kosten nach Benutzern aufzuschlüsseln.

Wenn Sie beispielsweise die Abfrage unten so ändern, dass sie USER_NAME einschließt, könnte der Bericht wie folgt aussehen:

USER_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

JOHN

WAREHOUSE1

11,255295833

SALLY

WAREHOUSE1

3,79444444

JOHN

WAREHOUSE2

1,636703054

Nach Rolle

Jede Abfrage, die in einem virtuellen Warehouse ausgeführt wird, ist mit der Rolle verbunden, die die Abfrage ausgeführt hat. Diese Daten sind in der Spalte ROLE_NAME der QUERY_HISTORY-Ansicht verfügbar. Jeder Snowflake-Benutzer hat mindestens eine Rolle.

Durch die Verknüpfung der Rolle der Abfrage aus der Ansicht QUERY_HISTORY mit den Nutzungsdaten der Ansicht WAREHOUSE_METERING_HISTORY kann der Kostenadministrator die Warehouse-Kosten nach Rollen aufschlüsseln.

Wenn Sie beispielsweise die Abfrage unten so ändern, dass sie ROLE_NAME einschließt, könnte der Bericht wie folgt aussehen:

ROLE_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_ADMIN

WAREHOUSE1

17,20239833

DEV_ADMIN

WAREHOUSE1

5,7990244

SALES_ADMIN

WAREHOUSE2

1,49765448

Nach Abfrage-Tag

Wenn mehrere Anwendungen denselben Benutzernamen und dasselbe Warehouse verwenden, kann der Sitzungsparameter QUERY_TAG dabei helfen, die Kosten den jeweiligen Anwendungen zuzuordnen. Dieser Sitzungsparameter wendet ein Tag auf Abfragen und andere SQL-Anweisungen an, die innerhalb einer Sitzung ausgeführt werden.

Um diese Zuordnungsstrategie zu verwenden, legen Sie zunächst den QUERY_TAG-Wert für die Sitzung fest. Beispiel:

ALTER SESSION SET QUERY_TAG = 'APP1'
Copy

Sobald dieser Parameter für die Sitzung festgelegt ist, wird jede Abfrage, die während der Sitzung ausgeführt wird, im QUERY_HISTORY-Ansicht zusammen mit dem Abfrage-Tag APP1 gespeichert.

Um einen Bericht über die mit bestimmten Abfrage-Tags verbundenen Kosten zu erstellen, ändern Sie die Abfrage unten, um QUERY_TAG einzuschließen. Das Ergebnis könnte wie folgt aussehen:

QUERY_TAG

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_APP

WAREHOUSE1

14,3027235

DEV_APP

WAREHOUSE1

11,2938568

SALES_APP

WAREHOUSE2

9,235620

Abfrage: Warehouse-Nutzung nach Benutzer, Rolle oder Abfrage-Tag aufteilen

Sie können eine Abfrage verwenden, um einen Bericht zu erstellen, der die Kosten der gemeinsam genutzten Warehouses nach Benutzer, nach Rolle oder nach Abfrage-Tag aufschlüsselt. Diese Abfrage ist im Grunde genommen immer dieselbe, unabhängig davon, wie die Kosten aufgeteilt werden. Sie verknüpft Abfrage-Metadaten aus dem QUERY_HISTORY-Ansicht mit Nutzungsdaten des WAREHOUSE_METERING_HISTORY-Ansicht, um die Warehouse-Kosten des letzten Monats aufzuschlüsseln.

Um einen Bericht zu generieren, passen Sie die folgende Abfrage an, indem Sie die SELECT-Anweisungen so ändern, dass die entsprechende Spalte der QUERY_HISTORY-Ansicht projiziert wird. Wenn Sie zum Warehouse-Kosten verschiedenen Rollen zuordnen, geben Sie die Spalte ROLE_NAME an.

-- 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