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.

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.

Drei Warehouses in einem Konto

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 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 » Cost Management.

  3. Wählen Sie Consumption aus.

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

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

  6. Wählen Sie Apply aus.

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

Sie können die Kostenzuordnung für alle Warehouses in einem bestimmten Monat mit ihren Tags und Tag-Werten anzeigen. Diese Abfrage identifiziert auch ungetaggte Warehouses:

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

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

Kostenzuordnung für Abfragen

Sie können die Ansicht QUERY_ATTRIBUTION_HISTORY verwenden, um die Kosten auf der Grundlage von Abfragen zu zuzuordnen. Die Kosten entsprechen der Credit-Nutzung des Warehouse für die Ausführung der Abfrage. Diese Kosten beinhalten keine andere Credit-Nutzung, die durch die Ausführung der Abfrage entsteht. Zum Beispiel sind die folgenden Kosten nicht in den Abfragekosten enthalten:

  • Datentransferkosten

  • Speicherkosten

  • Kosten für Clouddienst

  • Kosten für serverlose Features

  • Kosten für Token, die von AI-Diensten verarbeitet werden

Bei Abfragen, die gleichzeitig ausgeführt werden, werden die Kosten des Warehouse den einzelnen Abfragen auf der Grundlage des gewichteten Durchschnitts ihres Ressourcenverbrauchs während eines bestimmten Zeitintervalls zugewiesen.

Die Kosten pro Abfrage beinhalten nicht die Leerlaufzeit des Warehouses. Die Leerlaufzeit ist ein Zeitraum, in dem keine Abfragen im Warehouse laufen und kann auf Warehouse-Ebene gemessen werden.

Zuweisung der Kosten nach Tag, Benutzer und Abfrage

Sie können die Kosten für Warehouse und Abfragen nach Tag, Benutzer oder Abfrage (z. B. wiederkehrende Abfragen) zuordnen.

Zuordnung von Warehouse Kosten basierend auf Abfrage-Tags

Sie können den Parameter QUERY_TAG verwenden, um die Kosten auf verschiedene Workloads zu verteilen. Ein Abfrage-Tag kann auf Sitzungseben für einen Workload oder eine Gruppe von Abfragen zugewiesen werden. Weitere Informationen zur tagbasierten Zuordnung finden Sie unter Zuordnungs-Workflow.

Um ein Abfrage-Tag für eine Sitzung festzulegen, gehen Sie folgendermaßen vor:

  1. Erstellen Sie ein Tag. Erstellen Sie zum Beispiel ein Tag für das Finanzteam:

    CREATE TAG finance;
    
    Copy
  2. Legen Sie ein Abfrage-Tag für die aktuelle Sitzung fest:

    ALTER SESSION SET query_tag = finance;
    
    Copy

    Das Tag finance wird mit allen Abfragen verknüpft, die während der Sitzung ausgeführt werden.

  3. Um die Warehouse Kosten aller getaggten Abfragen für den aktuellen Monat anzuzeigen, führen Sie die folgende Anweisung aus. Beachten Sie, dass bei dieser Abfrage die gesamten Warehouse-Computekosten für den Abgleich auf die Tags verteilt werden (einschließlich Leerlaufzeit):

    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

Benutzerbasierte Zuordnung von Warehouse Kosten

Sie können die Kosten für das Warehouse nach Benutzer zuordnen. Um beispielsweise die gesamten Warehouse-Kosten zu ermitteln, die jedem Benutzer für den aktuellen Monat zugeordnet sind, führen Sie die folgende Anweisung aus:

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

Abfragekosten für wiederkehrende Abfragen

Für wiederkehrende oder ähnliche Abfragen verwenden Sie query_hash oder query_parameterized_hash, um die Kosten nach Abfrage zu gruppieren.

Um die teuersten wiederkehrenden Abfragen für den aktuellen Monat zu finden, führen Sie die folgende Anweisung aus:

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

Eine weitere Abfrage, die auf der Abfrage-ID basiert, finden Sie unter Beispiele.

Abfragekosten für hierarchische Abfragen

Bei gespeicherten Prozeduren, die mehrere hierarchische Abfragen durchführen, können Sie die zugewiesenen Abfragekosten der Prozedur berechnen, indem Sie die Stammabfrage ID für die Prozedur verwenden.

  1. Um die Stammabfrage-ID für eine gespeicherte Prozedur zu finden, verwenden Sie die Ansicht ACCESS_HISTORY. Um zum Beispiel die Stammabfrage-ID für eine gespeicherte Prozedur zu finden, stellen Sie query_id ein und führen Sie die folgenden Anweisungen aus:

    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

    Weitere Informationen dazu finden Sie unter Beispiel: Vorgängerabfragen mit gespeicherten Prozeduren.

  2. Um die Summe der Abfragekosten für die gesamte Prozedur zu summieren, ersetzen Sie <root_query_id> und führen Sie die folgenden Anweisungen aus:

    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