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:
Entwerfen einer Tagging-Strategie und Erstellen der entsprechenden Tags
Zuordnen der korrekten Tag/Wert-Paare zu den entsprechenden Ressourcen
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.

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;
- 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 auchwarehouse2
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';
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 SchemaSNOWFLAKE.ACCOUNT_USAGE
abgefragt werden.- Snowsight:
Wechseln Sie zu einer Rolle, die Zugriff auf das ACCOUNT_USAGE-Schema hat.
Navigieren Sie zu Admin » Cost Management.
Wählen Sie Consumption aus.
Wählen Sie in der Dropdown-Liste Tags das Tag
cost_center
aus.Um sich auf eine bestimmte Kostenstelle zu fokussieren, wählen Sie einen Wert aus der Liste der Werte des Tags aus.
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;
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;
+-------------+-------------+-----------------+ | 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:
Erstellen Sie ein Tag. Erstellen Sie zum Beispiel ein Tag für das Finanzteam:
CREATE TAG finance;
Legen Sie ein Abfrage-Tag für die aktuelle Sitzung fest:
ALTER SESSION SET query_tag = finance;
Das Tag
finance
wird mit allen Abfragen verknüpft, die während der Sitzung ausgeführt werden.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;
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;
+-----------+--------------------+
| 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;
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.
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;
Weitere Informationen dazu finden Sie unter Beispiel: Vorgängerabfragen mit gespeicherten Prozeduren.
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);