Leitfaden zur Snowflake SQL-Übersetzung

In diesem Dokument werden die Ähnlichkeiten und Unterschiede in der SQL-Syntax zwischen Snowflake und BigQuery beschrieben, um die Planung und Ausführung der Verlagerung Ihres Enterprise Data Warehouse (EDW) nach BigQuery zu beschleunigen. Snowflake für Data Warehousing wurde für die SQL-Syntax von Snowflake entwickelt. Für Snowflake geschriebene Skripts müssen möglicherweise geändert werden, bevor Sie sie in BigQuery verwenden können, da die SQL-Dialekte zwischen den Diensten variieren. Verwenden Sie die Batch-SQL-Übersetzung, um Ihre SQL-Skripts im Bulk zu migrieren, oder die interaktive SQL-Übersetzung, um Ad-hoc-Abfragen zu übersetzen. Snowflake SQL wird von beiden Tools in der Vorabversion unterstützt.

Datentypen

In diesem Abschnitt werden die Entsprechungen zwischen den Datentypen in Snowflake und BigQuery beschrieben.



Snowflake BigQuery Hinweise
NUMBER/ DECIMAL/NUMERIC NUMERIC/BIGNUMERIC Kann je nach Genauigkeit und Skalierung NUMERIC oder BIGNUMERIC zugeordnet werden.

Der Datentyp NUMBER in Snowflake unterstützt eine Genauigkeit von 38 Ziffern und 37 Dezimalstellen. Die Genauigkeit und Skalierung können durch den Nutzer festgelegt werden.

BigQuery unterstützt NUMERIC und BIGNUMERIC mit optional angegebener Genauigkeit und Skalierung innerhalb bestimmter Grenzen.
INT/INTEGER BIGNUMERIC INT/INTEGER und alle anderen INT-ähnlichen Datentypen wie BIGINT, TINYINT, SMALLINT, BYTEINT stellen einen Alias für den Datentyp NUMBER dar, bei dem die Genauigkeit und die Skalierung nicht angegeben werden können und immer NUMBER(38, 0)

BigQuery konvertiert INTEGER standardmäßig in INT64. Wenn Sie die SQL-Übersetzung so konfigurieren möchten, dass sie in andere Datentypen konvertiert wird, können Sie die Konfigurationsoption REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER verwenden.
BIGINT BIGNUMERIC
SMALLINT BIGNUMERIC
TINYINT BIGNUMERIC
BYTEINT BIGNUMERIC
FLOAT/
FLOAT4/
FLOAT8
FLOAT64 Der Datentyp FLOAT in Snowflake legt „NaN“ als > X fest, wobei X ein beliebiger FLOAT-Wert (außer „NaN“ selbst) ist.

Der Datentyp FLOAT in BigQuery legt „NaN“ als < X fest, wobei X ein beliebiger FLOAT-Wert (außer „NaN“ selbst) ist.
DOUBLE/
DOUBLE PRECISION/

REAL
FLOAT64 Der Datentyp DOUBLE in Snowflake ist mit dem Datentyp FLOAT in Snowflake identisch, wird aber häufig fälschlicherweise als FLOAT angezeigt. Er wird ordnungsgemäß als DOUBLE gespeichert.
VARCHAR STRING Der Datentyp VARCHAR in Snowflake hat eine maximale Länge von 128 MB (unkomprimiert). Wenn keine Länge angegeben ist, wird die standardmäßig die maximale Länge verwendet.

Der Datentyp STRING in BigQuery wird als UTF-8-codierter Unicode mit variabler Länge gespeichert. Weitere Informationen zu Spalten- und Zeilenlimits finden Sie unter Abfragejobs.
CHAR/CHARACTER STRING
STRING/TEXT STRING Der Datentyp STRING in Snowflake ist mit VARCHAR von Snowflake identisch.
BINARY BYTES
VARBINARY BYTES
BOOLEAN BOOL Der Datentyp BOOL in BigQuery kann nur TRUE/FALSE akzeptieren, im Gegensatz zum Datentyp BOOL in Snowflake, der TRUE/FALSE/NULL akzeptieren kann.
DATE DATE Der Typ DATE in Snowflake akzeptiert die meisten gängigen Datumsformate im Gegensatz zum Typ DATE in BigQuery, der nur Datumsangaben im Format „JJJJ-[M]M-[D]D“ akzeptiert.
TIME TIME Der TIME-Typ in Snowflake unterstützt eine Genauigkeit von 0 bis 9 Nanosekunden, während der Typ TIME in BigQuery eine Genauigkeit von 0 bis 6 Nanosekunden unterstützt.
TIMESTAMP DATETIME TIMESTAMP ist ein vom Nutzer konfigurierbarer Alias, der standardmäßig auf TIMESTAMP_NTZ festgelegt ist und in BigQuery DATETIME entspricht.
TIMESTAMP_LTZ TIMESTAMP
TIMESTAMP_NTZ/DATETIME
DATETIME
TIMESTAMP_TZ TIMESTAMP
OBJECT JSON
VARIANT JSON
ARRAY ARRAY<JSON> Der SQL-Übersetzungsdienst behält den Datentyp für typisierte Arrays bei. Bei untypisierten Arrays wie ARRAY<VARIANT> konvertiert BigQuery diese in ARRAY<JSON>.

BigQuery verfügt auch über die folgenden Datentypen, die kein direktes Snowflake-Analog haben:

CREATE FUNCTION-Syntax

In der folgenden Tabelle werden die Unterschiede in der SQL-UDF-Erstellungssyntax zwischen Snowflake und BigQuery behandelt.

Snowflake BigQuery

CREATE [ OR REPLACE ] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition

s

CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

AS sql_function_definition


Hinweis: In BigQuery SQL-UDF ist der Rückgabedatentyp optional. BigQuery leitet den Ergebnistyp der Funktion aus dem SQL-Funktionsrumpf ab, wenn eine Abfrage die Funktion aufruft.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS TABLE (col_name, col_data_type[,..])

AS sql_function_definition


CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Hinweis:In BigQuery SQL-UDF wird der zurückgegebene Tabellentyp derzeit nicht unterstützt. Er ist aber in Planung und wird bald verfügbar sein. BigQuery unterstützt jedoch die Rückgabe von ARRAY vom Typ STRUCT.

CREATE [SECURE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Hinweis: Snowflake bietet eine sichere Option zum Einschränken der UDF-Definition und der Details auf autorisierte Nutzer (d. h., auf die Nutzer, denen die Rolle gehört, die die Ansicht besitzt).

CREATE FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Hinweis: Die Sicherheit der Funktion ist in BigQuery kein konfigurierbarer Parameter. In BigQuery können IAM-Rollen und -Berechtigungen erstellt werden, um den Zugriff auf zugrunde liegende Daten und Funktionsdefinitionen einzuschränken.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Hinweis: Das Verhalten von Funktionen bei Null-Eingaben wird in BigQuery implizit behandelt und muss nicht als separate Option angegeben werden.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[VOLATILE | IMMUTABLE]

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Hinweis: Die Volatilität der Funktion ist in BigQuery kein konfigurierbarer Parameter. Die gesamte BigQuery-UDF-Volatilität entspricht der IMMUTABLE-Volatilität von Snowflake (d.0h., sie führt keine Datenbanksuche durch und verwendet keine Informationen, die nicht direkt in der Argumentliste vorhanden sind).

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS [' | $$]

sql_function_definition

[' | $$]

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Hinweis: Die Verwendung von einfachen Anführungszeichen oder einer Zeichensequenz wie Dollarzeichen ($$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[COMMENT = '<string_literal>']

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Note: Adding comments or descriptions in UDFs is not supported in BigQuery.

CREATE [OR REPLACE] FUNCTION function_name

(x integer, y integer)

RETURNS integer

AS $$

SELECT x + y

$$


Note: Snowflake does not support ANY TYPE for SQL UDFs. However, it supports using VARIANT data types.

CREATE [OR REPLACE] FUNCTION function_name

(x ANY TYPE, y ANY TYPE)

AS

SELECT x + y



Note: BigQuery supports using ANY TYPE as argument type. The function will accept an input of any type for this argument. For more information, see templated parameter in BigQuery.

BigQuery also supports the CREATE FUNCTION IF NOT EXISTSstatement which treats the query as successful and takes no action if a function with the same name already exists.

BigQuery's CREATE FUNCTIONstatement also supports creating TEMPORARY or TEMP functions, which do not have a Snowflake equivalent. See calling UDFs for details on executing a BigQuery persistent UDF.

DROP FUNCTION syntax

The following table addresses differences in DROP FUNCTION syntax between Snowflake and BigQuery.

Snowflake BigQuery

DROP FUNCTION [IF EXISTS]

function_name

([arg_data_type, ... ])

DROP FUNCTION [IF EXISTS] dataset_name.function_name


Note: BigQuery does not require using the function's signature (argument data type) for deleting the function.

BigQuery requires that you specify the project_name if the function is not located in the current project.

Additional function commands

This section covers additional UDF commands supported by Snowflake that are not directly available in BigQuery.

ALTER FUNCTION syntax

Snowflake supports the following operations using ALTER FUNCTION syntax.

  • Renaming a UDF
  • Converting to (or reverting from) a secure UDF
  • Adding, overwriting, removing a comment for a UDF

As configuring function security and adding function comments is not available in BigQuery, ALTER FUNCTION syntax is not supported. However, the CREATE FUNCTION statement can be used to create a UDF with the same function definition but a different name.

DESCRIBE FUNCTION syntax

Snowflake supports describing a UDF using DESC[RIBE] FUNCTION syntax. This is not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.

SHOW USER FUNCTIONS syntax

In Snowflake, SHOW USER FUNCTIONS syntax can be used to list all UDFs for which users have access privileges. This is not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.

Stored procedures

Snowflake stored procedures are written in JavaScript, which can execute SQL statements by calling a JavaScript API. In BigQuery, stored procedures are defined using a block of SQL statements.

CREATE PROCEDURE syntax

In Snowflake, a stored procedure is executed with a CALL command while in BigQuery, stored procedures are executed like any other BigQuery function.

The following table addresses differences in stored procedure creation syntax between Snowflake and BigQuery.

Snowflake BigQuery

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

AS procedure_definition;


Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_mode arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


arg_mode: IN | OUT | INOUT


Note: BigQuery doesn't support a return type for stored procedures. Also, it requires specifying argument mode for each argument passed.

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

AS

$$

javascript_code

$$;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

statement_list

END;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[{CALLED ON NULL INPUT | {RETURNS NULL ON NULL INPUT | STRICT}}]

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


Hinweis: Das Prozedurverhalten für Null-Eingaben wird in BigQuery implizit verarbeitet und muss nicht als separate Option angegeben werden.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[VOLATILE | IMMUTABLE]

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


Hinweis: Die Volatilität der Prozedur ist in BigQuery kein konfigurierbarer Parameter. Sie entspricht der IMMUTABLE-Volatilität von Snowflake.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[COMMENT = '<string_literal>']

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


Hinweis: Das Hinzufügen von Kommentaren oder Beschreibungen in Prozedurdefinitionen wird in BigQuery nicht unterstützt.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[EXECUTE AS { CALLER | OWNER }]

AS procedure_definition;


Hinweis: Snowflake unterstützt die Angabe des Aufrufers oder Eigentümers der Prozedur für die Ausführung.

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


Hinweis: Gespeicherte BigQuery-Prozeduren werden immer als Aufrufer ausgeführt.

BigQuery unterstützt auch die Anweisung CREATE PROCEDURE IF NOT EXISTS, die die Abfrage als erfolgreich behandelt und keine Aktion ausführt, wenn bereits eine Funktion mit demselben Namen vorhanden ist.

DROP PROCEDURE-Syntax

In der folgenden Tabelle werden die Unterschiede in der DROP FUNCTION-Syntax zwischen Snowflake und BigQuery behandelt.

Snowflake BigQuery

DROP PROCEDURE [IF EXISTS]

procedure_name

([arg_data_type, ... ])

DROP PROCEDURE [IF EXISTS] dataset_name.procedure_name


Hinweis: BigQuery erfordert zum Löschen der Prozedur nicht die Signatur der Prozedur (Argumentdatentyp).

BigQuery erfordert, dass Sie project_name angeben, wenn sich die Prozedur nicht im aktuellen Projekt befindet.

Zusätzliche Verfahrensbefehle

Snowflake bietet zusätzliche Befehle wie ALTER PROCEDURE, DESC[RIBE] PROCEDURE und SHOW PROCEDURES zum Verwalten der gespeicherten Prozeduren. Diese werden in BigQuery nicht unterstützt.

Metadaten- und Transaktions-SQL-Anweisungen

Snowflake BigQuery

BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]; START_TRANSACTION [ name <name> ];

BigQuery verwendet immer die Snapshot-Isolation. Weitere Informationen finden Sie an anderer Stelle in diesem Dokument unter Konsistenzgarantien.

COMMIT;

Wird in BigQuery nicht verwendet.

ROLLBACK;

Wird in BigQuery nicht verwendet.

SHOW LOCKS [ IN ACCOUNT ]; SHOW TRANSACTIONS [ IN ACCOUNT ]; Note: If the user has the ACCOUNTADMIN role, the user can see locks/transactions for all users in the account.

Wird in BigQuery nicht verwendet.

Mehrfachanweisungen und mehrzeilige SQL-Anweisungen

Sowohl Snowflake als auch BigQuery unterstützen Transaktionen (Sitzungen) und unterstützen daher durch Semikolons getrennte Anweisungen, die konsistent zusammen ausgeführt werden. Weitere Informationen finden Sie unter Transaktionen mit mehreren Anweisungen.

Metadatenspalten für bereitgestellte Dateien

Snowflake generiert automatisch Metadaten für Dateien in internen und externen Stagingbereichen. Diese Metadaten können zusammen mit regulären Datenspalten abgefragt und in eine Tabelle geladen werden. Die folgenden Metadatenspalten können verwendet werden:

Konsistenzgarantien und Transaktionsisolation

Sowohl Snowflake als auch BigQuery sind unteilbar, d. h. ACID-konform auf Mutationsebene über viele Zeilen hinweg.

Transaktionen

Jeder Snowflake-Transaktion wird eine eindeutige Startzeit (einschließlich Millisekunden) zugewiesen, die als Transaktions-ID festgelegt wird. Snowflake unterstützt nur die Isolationsebene READ COMMITTED. Eine Anweisung kann jedoch Änderungen sehen, die von einer anderen Anweisung vorgenommen wurden, wenn sich beide in derselben Transaktion befinden, auch wenn diese Änderungen noch nicht übernommen wurden. Bei Snowflake-Transaktionen werden Sperren für Ressourcen (Tabellen) abgerufen, wenn diese Ressource geändert wird. Nutzer können die maximale Wartezeit für eine blockierte Anweisung anpassen, bis das Zeitlimit für die Anweisung überschritten wird. DML-Anweisungen werden automatisch committet, wenn der Parameter AUTOCOMMIT aktiviert ist.

BigQuery unterstützt auch Transaktionen. BigQuery sorgt mit der Snapshot-Isolation für eine optimistische Nebenläufigkeitserkennung (der erste Commit erhält Vorrang), bei der eine Abfrage die letzten übergebenen Daten liest, bevor die Abfrage beginnt. Dieser Ansatz sorgt für die gleiche Konsistenz auf Zeilen- und Mutationsbasis sowie zeilenübergreifend innerhalb derselben DML-Anweisung, vermeidet dabei jedoch Deadlocks. Bei mehreren DML-Aktualisierungen für dieselbe Tabelle wechselt BigQuery zur pessimistischen Nebenläufigkeitserkennung. Ladejobs können vollständig unabhängig ausgeführt und an Tabellen angefügt werden. BigQuery bietet jedoch keine explizite Transaktionsgrenze oder Sitzung.

Rollback

Wenn die Sitzung einer Snowflake-Transaktion unerwartet beendet wird, bevor die Transaktion festgeschrieben oder zurückgesetzt wird, bleibt die Transaktion in einem getrennten Zustand. Der Nutzer sollte SYSTEM$ABORT_TRANSACTION ausführen, um die abgetrennte Transaktion abzubrechen. Andernfalls wird die abgetrennte Transaktion nach vier Stunden Inaktivität von Snowflake zurückgesetzt. Wenn ein Deadlock auftritt, erkennt Snowflake ihn und wählt die neuere Anweisung zum Rollback aus. Wenn die DML-Anweisung in einer explizit geöffneten Transaktion fehlschlägt, werden die Änderungen zurückgesetzt, die Transaktion bleibt jedoch geöffnet, bis ein Commit oder Rollback erfolgt. Für DDL-Anweisungen in Snowflake kann kein Rollback durchgeführt werden, da für sie automatisch ein Commit durchgeführt wird.

BigQuery unterstützt die Anweisung ROLLBACK TRANSACTION. In BigQuery gibt es keine ABORT-Anweisung.

Datenbanklimits

Die aktuellen Kontingente und Limits finden Sie immer in der öffentlichen BigQuery-Dokumentation . Viele Kontingente für Nutzer mit hohem Datenvolumen können durch Kontaktaufnahme mit dem Cloud-Supportteam erhöht werden.

Für alle Snowflake-Konten sind standardmäßig Softlimits festgelegt. Soft-Limits werden bei der Kontoerstellung festgelegt und können variieren. Viele Snowflake-Softlimits können über das Snowflake-Kontoteam oder ein Support-Ticket erhöht werden.

Die folgende Tabelle zeigt einen Vergleich der Snowflake- und BigQuery-Datenbanklimits.

Limit Snowflake BigQuery
Größe des Abfragetexts 1 MB 1 MB
Maximale Anzahl gleichzeitiger Anfragen XS Warehouse - 8
S Warehouse - 16
M Warehouse - 32
L Warehouse - 64
XL Warehouse - 128
100