Bekerja dengan kueri multi-pernyataan

Dokumen ini menjelaskan cara menggunakan kueri multi-pernyataan di BigQuery, seperti cara menulis kueri multi-pernyataan, menggunakan tabel sementara dalam kueri multi-pernyataan, variabel referensi dalam kueri multi-pernyataan, dan men-debug kueri multi-pernyataan.

Kueri multi-pernyataan adalah kumpulan pernyataan SQL yang dapat Anda jalankan dalam satu permintaan. Dengan kueri multi-pernyataan, Anda dapat menjalankan beberapa pernyataan secara berurutan, dengan status bersama. Kueri multi-pernyataan dapat memiliki efek samping seperti menambah atau mengubah data tabel.

Kueri multi-pernyataan sering digunakan dalam prosedur tersimpan dan mendukung pernyataan bahasa prosedur, yang memungkinkan melakukan hal-hal seperti penentuan variabel dan penerapan kontrol alur.

Menulis, menjalankan, dan menyimpan kueri multi-pernyataan

Kueri multipernyataan terdiri dari satu atau beberapa pernyataan SQL yang dipisahkan dengan titik koma. Setiap pernyataan SQL yang valid dapat digunakan dalam kueri multi-pernyataan. Kueri multipernyataan juga dapat menyertakan pernyataan bahasa prosedur, yang memungkinkan Anda menggunakan variabel atau menerapkan alur kontrol dengan pernyataan SQL.

Menulis kueri multi-pernyataan

Anda dapat menulis kueri multi-pernyataan di BigQuery. Kueri pernyataan multi-kueri berikut mendeklarasikan variabel dan menggunakan variabel di dalam pernyataan IF:

DECLARE day INT64;
SET day = (SELECT EXTRACT(DAYOFWEEK from CURRENT_DATE));
if day = 1 or day = 7 THEN
  SELECT 'Weekend';
ELSE
  SELECT 'Weekday';
END IF

BigQuery menafsirkan setiap permintaan dengan beberapa pernyataan sebagai kueri multi-pernyataan, kecuali jika pernyataan tersebut seluruhnya terdiri atas pernyataan CREATE TEMP FUNCTION diikuti dengan satu pernyataan SELECT. Misalnya, hal berikut tidak dianggap sebagai kueri multi-pernyataan:

CREATE TEMP FUNCTION Add(x INT64, y INT64) AS (x + y);
SELECT Add(3, 4);

Menjalankan kueri multi-pernyataan

Anda dapat menjalankan kueri multi-pernyataan dengan cara yang sama seperti kueri lainnya, misalnya, di Konsol Google Cloud atau menggunakan alat command line bq.

Uji coba kueri multi-pernyataan

Untuk memperkirakan jumlah byte yang dibaca oleh kueri multi-pernyataan, pertimbangkan uji coba. Uji coba kueri multi-pernyataan paling akurat untuk kueri yang hanya berisi pernyataan SELECT.

Uji coba memiliki penanganan khusus untuk jenis kueri dan pernyataan berikut:

  • Pernyataan CALL: uji coba memvalidasi bahwa prosedur yang dipanggil ada dan memiliki tanda tangan yang cocok dengan argumen yang diberikan. Konten prosedur yang dipanggil dan semua pernyataan setelah pernyataan CALL tidak divalidasi.
  • Pernyataan DDL: uji coba memvalidasi pernyataan DDL pertama, lalu berhenti. Semua pernyataan berikutnya akan dilewati.
  • Pernyataan DML: uji coba memvalidasi pernyataan DML, lalu terus memvalidasi pernyataan berikutnya. Dalam hal ini, estimasi byte didasarkan pada ukuran tabel asli, dan tidak memperhitungkan hasil pernyataan DML.
  • Pernyataan EXECUTE IMMEDIATE: uji coba memvalidasi ekspresi kueri, tetapi tidak mengevaluasi kueri dinamis itu sendiri. Semua pernyataan setelah pernyataan EXECUTE IMMEDIATE dilewati.
  • Kueri yang menggunakan variabel dalam filter partisi: uji coba memvalidasi kueri awal dan pernyataan berikutnya. Namun, uji coba tidak dapat menghitung nilai runtime variabel dalam filter partisi. Hal ini memengaruhi estimasi byte yang dibaca.
  • Kueri yang menggunakan variabel dalam ekspresi stempel waktu klausa FOR SYSTEM TIME AS OF: uji coba menggunakan konten tabel saat ini dan mengabaikan klausa FOR SYSTEM TIME AS OF. Hal ini memengaruhi estimasi byte yang dibaca jika ada perbedaan ukuran antara tabel saat ini dan iterasi tabel sebelumnya.
  • Pernyataan kontrol FOR, IF, dan WHILE: uji coba langsung berhenti. Ekspresi kondisi, isi pernyataan kontrol, dan semua pernyataan berikutnya tidak divalidasi.

Uji coba beroperasi berdasarkan upaya terbaik, dan proses yang mendasarinya dapat berubah. Uji coba tunduk kepada ketentuan berikut:

  • Kueri yang berhasil menyelesaikan uji coba mungkin tidak berhasil dijalankan. Misalnya, kueri mungkin gagal saat runtime karena alasan yang tidak terdeteksi oleh uji coba.
  • Kueri yang berhasil dijalankan mungkin tidak berhasil menyelesaikan uji coba. Misalnya, kueri mungkin gagal karena alasan eksekusi.
  • Uji coba yang berhasil dijalankan hari ini tidak dijamin selalu akan berjalan di masa mendatang. Misalnya, perubahan pada implementasi uji coba mungkin mendeteksi error dalam kueri yang sebelumnya tidak terdeteksi.

Menyimpan kueri multi-pernyataan

Untuk menyimpan kueri multi-pernyataan, lihat Menggunakan kueri tersimpan.

Menggunakan variabel dalam kueri multi-pernyataan

Kueri multipernyataan dapat berisi variabel buatan pengguna dan variabel sistem.

  • Anda dapat mendeklarasikan variabel buatan pengguna, menetapkan nilai pada variabel tersebut, dan mereferensikannya di seluruh kueri.

  • Anda dapat mereferensikan variabel sistem dalam kueri dan menetapkan nilai ke sebagian variabel tersebut, tetapi tidak seperti variabel buatan pengguna, Anda tidak mendeklarasikannya. Variabel sistem terdapat dalam BigQuery.

Mendeklarasikan variabel buatan pengguna

Anda harus mendeklarasikan variabel buatan pengguna di awal kueri multipernyataan atau di awal blok BEGIN. Variabel yang dideklarasikan di awal kueri multi-pernyataan berada dalam cakupan untuk seluruh kueri. Variabel yang dideklarasikan di dalam blok BEGIN memiliki cakupan untuk blok tersebut. Keduanya berada di luar cakupan setelah pernyataan END yang sesuai. Ukuran maksimum variabel adalah 1 MB dan ukuran maksimum semua variabel yang digunakan dalam kueri multipernyataan adalah 10 MB.

Anda dapat mendeklarasikan variabel dengan pernyataan prosedur DECLARE seperti ini:

DECLARE x INT64;

BEGIN
DECLARE y INT64;
-- Here you can reference x and y
END;

-- Here you can reference x, but not y

Menetapkan variabel buatan pengguna

Setelah mendeklarasikan variabel buatan pengguna, Anda dapat menetapkan nilai pada variabel tersebut dengan pernyataan prosedur SET seperti ini:

DECLARE x INT64 DEFAULT 0;
SET x = 10;

Menetapkan variabel sistem

Anda tidak membuat variabel sistem, tetapi Anda dapat mengganti nilai default untuk beberapa variabel seperti ini:

SET @@dataset_project_id = 'MyProject';

Anda juga dapat menetapkan dan secara implisit menggunakan variabel sistem dalam kueri multi-pernyataan. Misalnya, dalam kueri berikut, Anda harus menyertakan project setiap kali ingin membuat tabel baru:

BEGIN
  CREATE TABLE MyProject.MyDataset.MyTempTableA (id STRING);
  CREATE TABLE MyProject.MyDataset.MyTempTableB (id STRING);
END;

Jika tidak ingin menambahkan project ke jalur tabel beberapa kali, Anda dapat menetapkan MyProject project ID set data ke variabel sistem @@dataset_project_id di kueri multi-pernyataan. Penetapan ini akan menjadikan MyProject project default untuk kueri lainnya.

SET @@dataset_project_id = 'MyProject';

BEGIN
  CREATE TABLE MyDataset.MyTempTableA (id STRING);
  CREATE TABLE MyDataset.MyTempTableB (id STRING);
END;

Demikian pula, Anda dapat menetapkan variabel sistem @@dataset_id untuk menetapkan set data default untuk kueri. Contoh:

SET @@dataset_project_id = 'MyProject';
SET @@dataset_id = 'MyDataset';

BEGIN
  CREATE TABLE MyTempTableA (id STRING);
  CREATE TABLE MyTempTableB (id STRING);
END;

Anda juga dapat secara eksplisit mereferensikan variabel sistem seperti @@dataset_id di banyak bagian kueri multi-pernyataan. Untuk mempelajari lebih lanjut, lihat Mereferensi variabel sistem.

Mereferensi variabel buatan pengguna

Setelah mendeklarasikan dan menetapkan variabel buatan pengguna, Anda dapat mereferensikannya dalam kueri multi-pernyataan. Jika sebuah variabel dan kolom memiliki nama yang sama, kolom tersebut akan diprioritaskan.

Tindakan ini akan menampilkan column x + column x:

DECLARE x INT64 DEFAULT 0;
SET x = 10;

WITH Numbers AS (SELECT 50 AS x)
SELECT (x+x) AS result FROM Numbers;
+--------+
| result |
+--------+
| 100    |
+--------+

Tindakan ini akan menampilkan column y + variable x:

DECLARE x INT64 DEFAULT 0;
SET x = 10;

WITH Numbers AS (SELECT 50 AS y)
SELECT (y+x) AS result FROM Numbers;
+--------+
| result |
+--------+
| 60     |
+--------+

Mereferensi variabel sistem

Anda dapat mereferensikan variabel sistem dalam kueri multi-pernyataan.

Kueri berikut mengembalikan zona waktu default:

BEGIN
  SELECT @@time_zone AS default_time_zone;
END;
+-------------------+
| default_time_zone |
+-------------------+
| UTC               |
+-------------------+

Anda dapat menggunakan variabel sistem dengan kueri DDL dan DML. Misalnya, berikut ini beberapa cara untuk menggunakan variabel sistem @@time_zone saat membuat dan memperbarui tabel:

BEGIN
  CREATE TEMP TABLE MyTempTable
  AS SELECT @@time_zone AS default_time_zone;
END;
BEGIN
  CREATE OR REPLACE TABLE MyDataset.MyTable(default_time_zone STRING)
  OPTIONS (description = @@time_zone);
END;
BEGIN
  UPDATE MyDataset.MyTable
  SET default_time_zone = @@time_zone
  WHERE TRUE;
END;

Ada beberapa tempat dengan variabel sistem yang tidak dapat digunakan dalam kueri DDL dan DML. Misalnya, Anda tidak dapat menggunakan variabel sistem sebagai nama project, set data, atau nama tabel. Tindakan ini akan menghasilkan error saat Anda mencoba menyertakan variabel sistem @@dataset_id dalam jalur tabel:

BEGIN
  CREATE TEMP TABLE @@dataset_id.MyTempTable (id STRING);
END;

Menggunakan tabel sementara dalam kueri multi-pernyataan

Tabel sementara memungkinkan Anda menyimpan hasil menengah ke tabel. Tabel sementara dikelola oleh BigQuery, sehingga Anda tidak perlu menyimpan atau memeliharanya dalam sebuah {i>dataset<i}. Anda dikenakan biaya untuk penyimpanan tabel sementara.

Anda dapat membuat dan mereferensikan tabel sementara dalam kueri multi-pernyataan. Setelah selesai dengan tabel sementara, Anda dapat menghapusnya secara manual untuk meminimalkan biaya penyimpanan, atau menunggu BigQuery menghapusnya setelah 24 jam.

Membuat tabel sementara

Anda dapat membuat tabel sementara untuk kueri multi-pernyataan dengan pernyataan CREATE TABLE. Contoh berikut membuat tabel sementara untuk menyimpan hasil kueri dan menggunakan tabel sementara dalam subkueri:

-- Find the top 100 names from the year 2017.
CREATE TEMP TABLE top_names(name STRING)
AS
 SELECT name
 FROM `bigquery-public-data`.usa_names.usa_1910_current
 WHERE year = 2017
 ORDER BY number DESC LIMIT 100
;
-- Which names appear as words in Shakespeare's plays?
SELECT
 name AS shakespeare_name
FROM top_names
WHERE name IN (
 SELECT word
 FROM `bigquery-public-data`.samples.shakespeare
);

Selain penggunaan TEMP atau TEMPORARY, sintaksis-nya identik dengan sintaksis CREATE TABLE.

Saat Anda membuat tabel sementara, jangan gunakan penentu project atau set data dalam nama tabel. Tabel secara otomatis dibuat dalam set data khusus.

Mereferensi tabel sementara

Anda dapat mereferensi ke tabel sementara berdasarkan nama untuk durasi kueri multi-pernyataan saat ini. Referensi ini mencakup tabel sementara yang dibuat oleh prosedur dalam kueri multi-pernyataan. Anda tidak dapat membagikan tabel sementara. Tabel sementara berada dalam set data _script% tersembunyi dengan nama yang dibuat secara acak. Artikel Mencantumkan set data menjelaskan cara mencantumkan set data tersembunyi.

Menghapus tabel sementara

Anda dapat menghapus tabel sementara secara eksplisit sebelum kueri multi-pernyataan selesai menggunakan pernyataan DROP TABLE:

CREATE TEMP TABLE table1(x INT64);
SELECT * FROM table1;  -- Succeeds
DROP TABLE table1;
SELECT * FROM table1;  -- Results in an error

Setelah kueri multi-pernyataan selesai, tabel sementara akan ada hingga 24 jam.

Melihat data tabel sementara

Setelah membuat tabel sementara, Anda dapat melihat struktur tabel dan data apa pun di dalamnya. Untuk melihat struktur dan data tabel, ikuti langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Explorer BigQuery.

    Buka Explorer

  2. Klik Histori kueri.

  3. Pilih kueri yang membuat tabel sementara.

  4. Di baris Tabel tujuan, klik Tabel sementara.

Kualifikasi tabel sementara dengan _SESSION

Saat tabel sementara digunakan bersama dengan set data default, nama tabel tanpa penentuan merujuk pada tabel sementara jika ada, atau tabel dalam set data default. Pengecualian diberikan untuk pernyataan CREATE TABLE, saat tabel target dianggap sebagai tabel sementara jika dan hanya jika kata kunci TEMP atau TEMPORARY tersedia.

Misalnya, pertimbangkan kueri multi-pernyataan berikut:

-- Create table t1 in the default dataset
CREATE TABLE t1 (x INT64);

-- Create temporary table t1.
CREATE TEMP TABLE t1 (x INT64);

-- This statement selects from the temporary table.
SELECT * FROM t1;

-- Drop the temporary table
DROP TABLE t1;

-- Now that the temporary table is dropped, this statement selects from the
-- table in the default dataset.
SELECT * FROM t1;

Anda dapat secara eksplisit menunjukkan bahwa Anda merujuk ke tabel sementara dengan memenuhi penentuan nama tabel menggunakan _SESSION:

-- Create a temp table
CREATE TEMP TABLE t1 (x INT64);

-- Create a temp table using the `_SESSION` qualifier
CREATE TEMP TABLE _SESSION.t2 (x INT64);

-- Select from a temporary table using the `_SESSION` qualifier
SELECT * FROM _SESSION.t1;

Jika Anda menggunakan penentu _SESSION untuk kueri tabel sementara yang tidak ada, kueri multi-pernyataan akan menampilkan error yang menunjukkan bahwa tabel tersebut tidak ada. Misalnya, jika tidak ada tabel sementara bernama t3, kueri multi-pernyataan akan menampilkan error meskipun tabel bernama t3 ada di set data default.

Anda tidak dapat menggunakan _SESSION untuk membuat tabel yang bukan sementara:

CREATE TABLE _SESSION.t4 (x INT64);  -- Fails

Mengumpulkan informasi tentang tugas kueri multi-pernyataan

Tugas kueri multi-pernyataan berisi informasi tentang kueri multi-pernyataan yang telah dijalankan. Beberapa tugas umum yang dapat Anda lakukan dengan data tugas meliputi menampilkan pernyataan terakhir yang dijalankan dengan kueri multi-pernyataan atau menampilkan semua pernyataan yang dieksekusi dengan kueri multi-pernyataan.

Menampilkan pernyataan yang terakhir dijalankan

Metode jobs.getQueryResults menampilkan hasil kueri untuk pernyataan terakhir yang akan dijalankan dalam kueri multi-pernyataan. Jika tidak ada pernyataan yang dieksekusi, tidak ada hasil yang ditampilkan.

Menampilkan semua pernyataan yang dijalankan

Untuk mendapatkan hasil dari semua pernyataan dalam kueri multi-pernyataan, enumerasi tugas turunan dan panggil jobs.getQueryResults di setiap mereka.

Menghitung tugas turunan

Kueri multi-pernyataan dijalankan di BigQuery menggunakan jobs.insert, serupa dengan kueri lainnya, dengan kueri multi-pernyataan yang ditentukan sebagai teks kueri. Saat kueri multi-pernyataan dijalankan, tugas tambahan, yang dikenal sebagai tugas turunan, akan dibuat untuk setiap pernyataan dalam kueri multi-pernyataan. Anda dapat menghitung tugas turunan dari kueri multi-pernyataan dengan memanggil jobs.list, yang meneruskan ID tugas kueri multi-pernyataan sebagai parentJobId parameter kueri.

Men-debug kueri multi-pernyataan

Berikut beberapa tips untuk men-debug kueri multi-pernyataan:

  • Gunakan pernyataan ASSERT untuk menyatakan bahwa kondisi Boolean benar.

  • Gunakan BEGIN...EXCEPTION...END untuk menemukan error dan menampilkan pesan error serta pelacakan tumpukan.

  • Gunakan SELECT FORMAT("....") untuk menampilkan hasil menengah.

  • Saat menjalankan kueri multi-pernyataan di Google Cloud Console, Anda dapat melihatstack traceoutput setiap pernyataan dalam kueri multi-pernyataan. Perintah 'bq query` pada alat command line bq juga menampilkan hasil setiap langkah saat Anda menjalankan kueri multi-pernyataan.

  • Di Konsol Google Cloud, Anda dapat memilih satu pernyataan di dalam editor kueri dan menjalankannya.

Izin

Izin untuk mengakses tabel, model, atau resource lainnya diperiksa pada saat dijalankan. Jika sebuah pernyataan tidak dieksekusi, atau ekspresi tidak dievaluasi, BigQuery tidak akan memeriksa apakah pengguna yang menjalankan kueri multi-pernyataan memiliki akses ke resource apa pun yang direferensikan olehnya.

Dalam kueri multi-pernyataan, izin untuk setiap ekspresi atau pernyataan divalidasi secara terpisah. Contoh:

SELECT * FROM dataset_with_access.table1;
SELECT * FROM dataset_without_access.table2;

Jika pengguna yang menjalankan kueri memiliki akses ke table1 tetapi tidak memiliki akses ke table2, kueri pertama akan berhasil sementara kueri kedua akan gagal. Tugas kueri multi-pernyataan itu sendiri juga akan gagal.

Batasan keamanan

Dalam kueri multi-pernyataan, Anda dapat menggunakan SQL dinamis untuk membuat pernyataan SQL saat runtime. Cara ini memang praktis, tetapi juga bisa memberikan peluang baru untuk penyalahgunaan. Misalnya, menjalankan kueri berikut akan menimbulkan potensi ancaman keamanan injeksi SQL karena parameter tabel dapat difilter dengan tidak benar, memungkinkan akses, dan dijalankan pada tabel yang tidak diinginkan.

-- Risky query vulnerable to SQL injection attack.
EXECUTE IMMEDIATE CONCAT('SELECT * FROM SensitiveTable WHERE id = ', @id);

Untuk menghindari ekspos atau kebocoran data sensitif dalam tabel atau menjalankan perintah seperti DROP TABLE untuk menghapus data dalam tabel, pernyataan prosedur dinamis BigQuery mendukung beberapa langkah keamanan untuk mengurangi eksposur terhadap serangan injeksi SQL, termasuk:

  • Pernyataan EXECUTE IMMEDIATE tidak mengizinkan kuerinya, yang diperluas dengan parameter dan variabel kueri, untuk menyematkan beberapa pernyataan SQL.
  • Perintah berikut dibatasi agar tidak dijalankan secara dinamis: BEGIN/END danCALL danCASE danIF danLOOP danWHILE , dan EXECUTE IMMEDIATE singkat ini.

Batasan kolom konfigurasi

Kolom kueri konfigurasi tugas berikut tidak dapat ditetapkan untuk kueri multi-pernyataan:

  • clustering
  • create_disposition
  • destination_table
  • destination_encryption_configuration
  • range_partitioning
  • schema_update_options
  • time_partitioning
  • user_defined_function_resources
  • write_disposition

Harga

Harga untuk kueri multi-pernyataan mencakup biaya kueri (saat menggunakan model penagihan on demand) dan penyimpanan untuk tabel sementara. Saat Anda menggunakan reservasi, penggunaan kueri akan tercakup dalam biaya reservasi Anda.

Penghitungan ukuran kueri sesuai permintaan

Jika Anda menggunakan penagihan on-demand, BigQuery mengenakan biaya untuk kueri multi-pernyataan berdasarkan jumlah byte yang diproses selama operasi kueri multi-pernyataan.

Untuk mendapatkan perkiraan jumlah byte yang mungkin diproses oleh kueri multi-pernyataan, Anda dapat menjalankan uji coba.

Harga berikut berlaku untuk kueri multi-pernyataan ini:

  • DECLARE: jumlah byte yang dipindai untuk tabel yang direferensikan dalam ekspresi DEFAULT. Pernyataan DECLARE tanpa referensi tabel tidak akan dikenai biaya.

  • SET: jumlah byte yang dipindai untuk tabel yang dirujuk dalam ekspresi. Pernyataan SET tanpa referensi tabel tidak akan dikenai biaya.

  • IF: jumlah byte yang dipindai untuk tabel yang direferensikan dalam ekspresi kondisi. Ekspresi kondisi IF tanpa referensi tabel tidak dikenai biaya. Setiap pernyataan dalam blok IF yang tidak dieksekusi tidak akan dikenai biaya.

  • WHILE: jumlah byte yang dipindai untuk tabel yang direferensikan dalam ekspresi kondisi. Pernyataan WHILE tanpa referensi tabel dalam ekspresi kondisi tidak dikenai biaya. Setiap pernyataan dalam blok WHILE yang tidak dieksekusi tidak akan dikenai biaya.

  • CONTINUE atau ITERATE: Tidak ada biaya terkait.

  • BREAK atau LEAVE: Tidak ada biaya terkait.

  • BEGIN atau END: Tidak ada biaya terkait.

Jika kueri multi-pernyataan gagal, biaya pernyataan apa pun hingga kegagalan akan masih tetap berlaku. Pernyataan yang gagal tidak akan menimbulkan biaya apa pun.

Misalnya, kode contoh berikut berisi komentar sebelum setiap pernyataan yang menjelaskan biaya yang, jika ada, yang dikeluarkan oleh setiap pernyataan:

-- No cost, since no tables are referenced.
DECLARE x DATE DEFAULT CURRENT_DATE();
-- Incurs the cost of scanning string_col from dataset.table.
DECLARE y STRING DEFAULT (SELECT MAX(string_col) FROM dataset.table);
-- Incurs the cost of copying the data from dataset.big_table.  Once the
-- table is created, you are not charged for storage while the rest of the
-- multi-statement query runs.
CREATE TEMP TABLE t AS SELECT * FROM dataset.big_table;
-- Incurs the cost of scanning column1 from temporary table t.
SELECT column1 FROM t;
-- No cost, since y = 'foo' doesn't reference a table.
IF y = 'foo' THEN
  -- Incurs the cost of scanning all columns from dataset.other_table, if
  -- y was equal to 'foo', or otherwise no cost since it is not executed.
  SELECT * FROM dataset.other_table;
ELSE
  -- Incurs the cost of scanning all columns from dataset.different_table, if
  -- y was not equal to 'foo', or otherwise no cost since it is not executed.
  UPDATE dataset.different_table
  SET col = 10
  WHERE true;
END IF;
-- Incurs the cost of scanning date_col from dataset.table for each
-- iteration of the loop.
WHILE x < (SELECT MIN(date_col) FROM dataset.table) DO
  -- No cost, since the expression does not reference any tables.
  SET x = DATE_ADD(x, INTERVAL 1 DAY);
  -- No cost, since the expression does not reference any tables.
  IF true THEN
    -- LEAVE has no associated cost.
    LEAVE;
  END IF;
  -- Never executed, since the IF branch is always taken, so does not incur
  -- a cost.
  SELECT * FROM dataset.big_table;
END WHILE;

Untuk mengetahui informasi selengkapnya, lihat Penghitungan ukuran kueri.

Harga penyimpanan

Anda dikenai biaya untuk tabel sementara yang dibuat oleh kueri multi-pernyataan. Anda dapat menggunakan tampilan TABLE_STORAGE atau TABLE_STORAGE_USAGE_TIMELINE untuk melihat penyimpanan yang digunakan oleh tabel sementara ini. Tabel sementara berada dalam set data _script% tersembunyi dengan nama yang dibuat secara acak.

Kuota

Untuk mengetahui informasi tentang kuota kueri multi-pernyataan, lihat Kuota dan batas.

Melihat jumlah kueri multi-pernyataan

Anda dapat melihat jumlah kueri multi-pernyataan aktif menggunakan tampilan INFORMATION_SCHEMA.JOBS_BY_PROJECT. Contoh berikut menggunakan tampilan INFORMATION_SCHEMA.JOBS_BY_PROJECT untuk menampilkan jumlah kueri multi-pernyataan dari hari sebelumnya:

SELECT
  COUNT(*)
FROM
  `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
  creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP()
AND job_type = "QUERY"
AND state = 'RUNNING'
AND statement_type = 'SCRIPT'

Untuk informasi selengkapnya tentang membuat kueri INFORMATION_SCHEMA.JOBS untuk kueri multi-pernyataan, lihat Tugas kueri multi-pernyataan.