Panduan terjemahan SQL Snowflake
Dokumen ini menjelaskan persamaan dan perbedaan sintaksis SQL antara Snowflake dan BigQuery untuk membantu mempercepat perencanaan dan eksekusi pemindahan EDW (Enterprise Data Warehouse) Anda ke BigQuery. Data warehousing Snowflake dirancang untuk digunakan dengan sintaksis SQL khusus Snowflake. Skrip yang ditulis untuk Snowflake mungkin perlu diubah sebelum Anda dapat menggunakannya di BigQuery, karena dialek SQL bervariasi antarlayanan. Gunakan terjemahan SQL batch untuk memigrasikan skrip SQL secara massal, atau terjemahan SQL interaktif untuk menerjemahkan kueri ad hoc. Snowflake SQL didukung oleh kedua alat dalam pratinjau.
Jenis data
Bagian ini menampilkan padanan antara jenis data di Snowflake dan BigQuery.
| Snowflake | BigQuery | Catatan |
|---|---|---|
NUMBER/
DECIMAL/NUMERIC |
NUMERIC/BIGNUMERIC |
Dapat dipetakan ke NUMERIC atau BIGNUMERIC, bergantung pada presisi dan skala.Jenis data NUMBER di Snowflake mendukung presisi 38 digit dan skala 37 digit. Presisi dan skala dapat ditentukan sesuai dengan pengguna.BigQuery mendukung NUMERIC dan BIGNUMERIC dengan presisi dan skala yang ditentukan secara opsional dalam batas tertentu. |
INT/INTEGER |
BIGNUMERIC |
INT/INTEGER dan semua jenis data lainnya yang mirip dengan INT, seperti BIGINT, TINYINT, SMALLINT, BYTEINT mewakili alias untuk jenis data NUMBER dengan presisi dan skala tidak dapat ditentukan dan selalu NUMBER(38, 0)BigQuery mengonversi INTEGER menjadi INT64 secara default. Untuk mengonfigurasi terjemahan SQL agar mengonversinya ke tipe data lain, Anda dapat menggunakan opsi konfigurasi REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER |
BIGINT |
BIGNUMERIC |
|
SMALLINT |
BIGNUMERIC |
|
TINYINT |
BIGNUMERIC |
|
BYTEINT |
BIGNUMERIC |
|
FLOAT/ |
FLOAT64 |
Jenis data FLOAT di Snowflake menetapkan 'NaN' sebagai > X, dengan X adalah nilai FLOAT (selain 'NaN' itu sendiri).Jenis data FLOAT di BigQuery menetapkan 'NaN' sebagai < X, dengan X adalah nilai FLOAT (selain 'NaN' itu sendiri). |
DOUBLE/REAL |
FLOAT64 |
Jenis data DOUBLE di Snowflake mirip dengan jenis data FLOAT di Snowflake, tetapi biasanya salah ditampilkan sebagai FLOAT. File disimpan dengan benar sebagai DOUBLE. |
VARCHAR |
STRING |
Jenis data VARCHAR di Snowflake memiliki panjang maksimum 128 MB (tidak dikompresi). Jika panjang tidak ditentukan, panjang defaultnya adalah panjang maksimum.Jenis data STRING di BigQuery disimpan sebagai Unicode berenkode UTF-8 dengan panjang variabel. Untuk mengetahui informasi selengkapnya tentang batas kolom dan baris, lihat Tugas kueri. |
CHAR/CHARACTER |
STRING |
|
STRING/TEXT |
STRING |
Jenis data STRING di Snowflake identik dengan VARCHAR Snowflake. |
BINARY |
BYTES |
|
VARBINARY |
BYTES |
|
BOOLEAN |
BOOL |
Jenis data BOOL di BigQuery hanya dapat menerima TRUE/FALSE, tidak seperti jenis data BOOL di Snowflake, yang dapat menerima TRUE/FALSE/NULL. |
DATE |
DATE |
Jenis DATE di Snowflake menerima format tanggal yang paling umum, tidak seperti jenis DATE di BigQuery, yang hanya menerima tanggal dalam format, 'YYYY-[M]M-[D]D'. |
TIME |
TIME |
Jenis TIME di Snowflake mendukung presisi 0 hingga 9 nanodetik, sedangkan jenis TIME di BigQuery mendukung presisi 0 hingga 6 nanodetik. |
TIMESTAMP |
DATETIME |
TIMESTAMP adalah alias yang dapat dikonfigurasi pengguna dan ditetapkan secara default ke TIMESTAMP_NTZ yang memetakan ke DATETIME di BigQuery. |
TIMESTAMP_LTZ |
TIMESTAMP |
|
TIMESTAMP_NTZ/DATETIME | ||
DATETIME |
||
TIMESTAMP_TZ |
TIMESTAMP |
|
OBJECT |
JSON |
|
VARIANT |
JSON |
|
ARRAY |
ARRAY<JSON> |
Layanan terjemahan SQL mempertahankan jenis data untuk array yang diketik. Untuk array yang tidak memiliki jenis, seperti ARRAY<VARIANT>, BigQuery mengonversinya menjadi ARRAY<JSON> |
BigQuery juga memiliki jenis data berikut yang tidak memiliki analog Snowflake langsung:
Sintaksis CREATE FUNCTION
Tabel berikut membahas perbedaan sintaksis pembuatan UDF SQL antara Snowflake dan BigQuery.
| Snowflake | BigQuery |
|---|---|
|
Catatan: Di BigQuery UDF pada SQL, jenis data yang ditampilkan bersifat opsional. BigQuery menyimpulkan jenis hasil fungsi dari isi fungsi SQL saat kueri memanggil fungsi. |
|
Catatan:Di SQL UDF BigQuery, jenis tabel yang ditampilkan tidak didukung, tetapi ada dalam roadmap produk dan akan segera tersedia. Namun, BigQuery mendukung ditampilkannya ARRAY jenis STRUCT. |
|
Catatan: Snowflake memberikan opsi yang aman untuk membatasi definisi dan detail UDF hanya kepada pengguna yang diberi otorisasi (yaitu, pengguna yang diberi peran yang memiliki tampilan). |
Catatan: Keamanan fungsi bukanlah parameter yang dapat dikonfigurasi di BigQuery. BigQuery mendukung pembuatan peran dan izin IAM guna membatasi akses ke data pokok dan definisi fungsi. |
|
Catatan: Perilaku fungsi untuk input null secara implisit ditangani di BigQuery dan tidak perlu ditentukan sebagai opsi terpisah. |
|
Catatan:Volatilitas fungsi bukanlah parameter yang dapat dikonfigurasi di BigQuery. Semua volatilitas BigQuery UDF setara dengan volatilitas IMMUTABLE Snowflake (artinya, tidak melakukan pencarian database atau menggunakan informasi yang tidak langsung ada dalam daftar argumennya). |
|
CREATE [OR REPLACE] FUNCTION
Catatan: Penggunaan tanda kutip tunggal atau rangkaian karakter seperti kutipan dolar ($$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression. |
|
Note: Adding comments or descriptions in UDFs is not supported in BigQuery. |
|
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 |
|---|---|
|
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 |
|---|---|
|
Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option. |
CREATE [OR REPLACE] PROCEDURE
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
Catatan: Perilaku prosedur untuk input null secara implisit ditangani di BigQuery dan tidak perlu ditentukan sebagai opsi terpisah. |
CREATE [OR REPLACE] PROCEDURE
|
Catatan:Ketidakstabilan prosedur bukanlah parameter yang dapat dikonfigurasi di BigQuery. Ini setara dengan volatilitas IMMUTABLE Snowflake. |
CREATE [OR REPLACE] PROCEDURE
|
Catatan: Menambahkan komentar atau deskripsi dalam definisi prosedur tidak didukung di BigQuery. |
CREATE [OR REPLACE] PROCEDURE
Catatan: Snowflake mendukung penentuan pemanggil atau pemilik prosedur eksekusi |
Catatan: Prosedur yang disimpan di BigQuery selalu dijalankan sebagai pemanggil |
BigQuery juga mendukung pernyataan CREATE PROCEDURE IF NOT EXISTS yang memperlakukan kueri sebagai berhasil dan tidak mengambil tindakan jika fungsi dengan nama yang sama sudah ada.
Sintaksis DROP PROCEDURE
Tabel berikut membahas perbedaan sintaksis DROP FUNCTION antara Snowflake dan BigQuery.
| Snowflake | BigQuery |
|---|---|
|
Catatan: BigQuery tidak memerlukan penggunaan tanda tangan prosedur (jenis data argumen) untuk menghapus prosedur. |
BigQuery mengharuskan Anda menentukan project_name jika prosedur tidak berada di project saat ini.
Perintah prosedur tambahan
Snowflake menyediakan perintah tambahan seperti
ALTER PROCEDURE.DESC[RIBE] PROCEDURE ,
dan
SHOW PROCEDURES
untuk mengelola prosedur yang tersimpan. Hal ini tidak didukung di BigQuery.
Pernyataan SQL transaksi dan metadata
| Snowflake | BigQuery |
|---|---|
|
BigQuery selalu menggunakan Snapshot Isolation. Untuk mengetahui detailnya, lihat Jaminan konsistensi di bagian lain dalam dokumen ini. |
|
Tidak digunakan di BigQuery. |
|
Tidak digunakan di BigQuery. |
|
Tidak digunakan di BigQuery. |
Pernyataan SQL multi-pernyataan dan multi-baris
Snowflake dan BigQuery mendukung transaksi (sesi) dan oleh karena itu, mendukung pernyataan yang dipisahkan dengan titik koma yang dijalankan bersama secara konsisten. Untuk informasi selengkapnya, lihat Transaksi multi-pernyataan.
Kolom metadata untuk file bertahap
Snowflake secara otomatis menghasilkan metadata untuk file dalam tahap internal dan eksternal. Metadata ini dapat dikueri dan dimuat ke dalam tabel bersama kolom data reguler. Kolom metadata berikut dapat digunakan:
Jaminan konsistensi dan transaction isolation
Snowflake dan BigQuery bersifat atomik—yaitu, mematuhi ACID pada tingkat per mutasi di banyak baris.
Transaksi
Setiap transaksi Snowflake diberi waktu mulai unik (termasuk milidetik) yang ditetapkan sebagai ID transaksi. Snowflake hanya mendukung
tingkat isolasi
READ COMMITTED. Namun, sebuah pernyataan dapat melihat perubahan yang dibuat oleh pernyataan lain jika keduanya berada dalam transaksi yang sama, meskipun perubahan tersebut belum di-commit. Transaksi Snowflake memperoleh kunci pada resource (tabel) saat resource tersebut diubah. Pengguna dapat menyesuaikan waktu maksimum pernyataan
yang diblokir akan menunggu hingga waktu pernyataan Anda habis. Pernyataan DML
diotomatiskan jika parameter
AUTOCOMMIT
diaktifkan.
BigQuery juga mendukung transaksi. BigQuery membantu memastikan kontrol serentak optimis (kemenangan pertama dengan commit) dengan isolasi snapshot, di mana kueri membaca pesan terakhir yang di-commit data sebelum kueri dimulai. Pendekatan ini menjamin tingkat konsistensi yang sama pada basis per baris, per mutasi, dan di seluruh baris dalam pernyataan DML yang sama, namun menghindari deadlock. Dalam kasus beberapa update DML terhadap tabel yang sama, BigQuery akan beralih ke kontrol serentak pesimis. Tugas pemuatan dapat berjalan sepenuhnya secara independen dan ditambahkan ke tabel. Namun, BigQuery tidak menyediakan batas transaksi atau sesi eksplisit.
Rollback
Jika sesi transaksi Snowflake tiba-tiba dihentikan sebelum transaksi di-commit atau di-roll back, transaksi akan dibiarkan dalam status terpisah. Pengguna harus menjalankan SYSTEM$ABORT_TRANSACTION untuk membatalkan transaksi yang terpisah, atau Snowflake akan me-roll back transaksi terpisah setelah empat jam tidak ada aktivitas. Jika terjadi deadlock, Snowflake akan mendeteksi deadlock dan memilih pernyataan yang lebih baru untuk melakukan roll back. Jika pernyataan DML dalam transaksi yang dibuka secara eksplisit gagal, perubahan akan di-roll back, tetapi transaksi akan tetap terbuka hingga di-commit atau di-roll back. Pernyataan DDL di Snowflake tidak dapat di-roll back karena di-commit secara otomatis.
BigQuery mendukung pernyataan ROLLBACK TRANSACTION.
Tidak ada
pernyataan ABORT
di BigQuery.
Batas database
Selalu periksa dokumentasi publik BigQuery untuk mengetahui kuota dan batas terbaru. Banyak kuota untuk pengguna bervolume besar dapat ditambah dengan menghubungi tim Dukungan Cloud.
Semua akun Snowflake memiliki batas yang dapat dilewati secara default. Batas sementara ditetapkan selama pembuatan akun dan dapat bervariasi. Banyak batas lunak Snowflake dapat dinaikkan melalui tim akun Snowflake atau tiket dukungan.
Tabel berikut menunjukkan perbandingan batas database Snowflake dan BigQuery.
| Batas | Snowflake | BigQuery |
|---|---|---|
| Ukuran teks kueri | 1 MB | 1 MB |
| Jumlah maksimum kueri serentak | XS Warehouse - 8 S Warehouse - 16 M Warehouse - 32 L Warehouse - 64 XL Warehouse - 128 |
100 |