Menulis kueri dalam sesi
Dokumen ini menjelaskan cara menulis kueri dalam sesi BigQuery. Panduan ini ditujukan bagi pengguna yang sudah memiliki pemahaman umum tentang sesi BigQuery dan mengetahui cara menjalankan kueri dalam satu sesi.
Sesi menyimpan status. Status yang dibuat dalam sebuah sesi dipertahankan dan dapat digunakan di sepanjang sesi. Jadi, jika membuat tabel sementara dalam satu entri kueri, Anda dapat menggunakan tabel sementara tersebut dalam entri kueri lainnya untuk sisa sesi.
Sesi mencakup dukungan untuk variabel sesi, variabel sistem sesi, kueri multi-pernyataan, dan transaksi multi-pernyataan.
Sebelum menyelesaikan langkah-langkah ini, pastikan Anda memiliki izin yang diperlukan untuk bekerja dalam sebuah sesi.
Menggunakan variabel sistem dalam sebuah sesi
Anda dapat menetapkan atau mengambil data tingkat sesi dengan variabel sistem berikut:
@@dataset_id
: ID set data default dalam project saat ini. Variabel sistem@@dataset_project_id
dan@@dataset_id
dapat ditetapkan dan digunakan bersama-sama.@@dataset_project_id
: ID project default untuk set data yang digunakan dalam kueri. Jika variabel sistem ini tidak ditetapkan, atau jika ditetapkan keNULL
, project yang menjalankan kueri akan digunakan. Variabel sistem@@dataset_project_id
dan@@dataset_id
dapat ditetapkan dan digunakan bersama.@@query_label
: Label tugas yang akan ditetapkan ke sesi. Label ini dapat digunakan di sepanjang sesi, bukan hanya untuk kueri tertentu dalam sesi tersebut.@@session_id
: ID sesi saat ini.@@time_zone
: Zona waktu default untuk digunakan dalam fungsi SQL yang bergantung zona waktu, jika zona waktu tidak ditentukan sebagai argumen.
Variabel sistem ini dapat digunakan kapan saja selama sesi dan berada dalam
cakupan sesi yang tersisa. Anda tidak menentukan variabel ini, tetapi variabel ini dapat
ditetapkan nilai baru dengan
pernyataan SET
.
Ukuran maksimum variabel dalam sesi adalah 1 MB, dan ukuran maksimum semua variabel dalam sesi adalah 10 MB.
Menetapkan label ke sesi
Anda dapat menetapkan label pekerjaan ke sesi. Saat Anda melakukannya, semua kueri mendatang dalam sesi tersebut akan ditetapkan ke label. Label dapat digunakan kapan saja selama sesi dan berada dalam cakupan untuk sesi lainnya. Label tugas yang Anda tetapkan akan muncul di log audit.
Menggunakan variabel dalam sesi
Anda dapat membuat, menetapkan, dan mengambil data tingkat sesi dengan variabel. Variabel dapat digunakan kapan saja selama sesi dan berada dalam cakupan untuk sesi lainnya.
- Untuk membuat variabel cakupan sesi, gunakan pernyataan
DECLARE
di luar blokBEGIN...END
. - Untuk menetapkan variabel cakupan sesi setelah dibuat, gunakan pernyataan
SET
. - Variabel yang dideklarasikan di dalam blok
BEGIN...END
bukan variabel cakupan sesi. - Variabel cakupan sesi dapat direferensikan di dalam blok
BEGIN...END
. - Variabel cakupan sesi dapat ditetapkan di dalam blok
BEGIN...END
.
Ukuran maksimum variabel dalam sesi adalah 1 MB, dan ukuran maksimum semua variabel dalam sesi adalah 10 MB.
Menggunakan tabel sementara dalam sesi
Tabel sementara memungkinkan Anda menyimpan hasil menengah ke tabel. Tabel sementara terlihat pada tingkat sesi, sehingga Anda tidak perlu menyimpan atau mempertahankannya dalam set data. Data ini secara otomatis dihapus setelah sesi berakhir. Anda akan dikenai biaya untuk penyimpanan tabel sementara saat sesi aktif. Untuk mengetahui informasi selengkapnya tentang tabel sementara, lihat Bekerja dengan kueri multi-pernyataan.
Menggunakan fungsi sementara dalam sesi
Fungsi sementara terlihat di tingkat sesi, sehingga Anda tidak perlu menyimpan atau mempertahankannya dalam set data. Data ini secara otomatis dihapus setelah sesi berakhir.
Bekerja dengan kueri multi-pernyataan dalam sesi
Anda dapat menggunakan kueri multi-pernyataan GoogleSQL dalam satu sesi. Skrip dapat menyertakan tabel sementara dan variabel sistem untuk setiap skrip. Variabel sesi dan tabel sementara dapat dilihat oleh skrip. Semua variabel tingkat teratas yang dideklarasikan dalam skrip juga merupakan variabel sesi.
Menjalankan transaksi multi-pernyataan multi-kueri dalam sesi
Anda dapat menjalankan transaksi multi-pernyataan melalui beberapa kueri dalam satu sesi. Contoh:
Kueri berikut memulai transaksi.
BEGIN TRANSACTION
Di dalam transaksi, kueri berikut membuat tabel sementara bernama Flights
, lalu menampilkan data dalam tabel ini. Dua pernyataan dimasukkan
dalam kueri.
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
SELECT * FROM Flights;
Kueri berikut meng-commit transaksi.
COMMIT
Anda dapat menemukan transaksi aktif yang memengaruhi tabel Flights
:
WITH running_transactions AS (
SELECT DISTINCT transaction_id
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
EXCEPT DISTINCT
SELECT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND statement_type = "COMMIT_TRANSACTION"
OR statement_type = "ROLLBACK_TRANSACTION"
)
SELECT
jobs.transaction_id AS transaction_id,
project_id,
user_email,
session_info.session_id,
query
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT AS jobs, running_transactions
WHERE
creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND destination_table = ("Flights")
AND jobs.transaction_id = running_transactions.transaction_id;
Jika ingin membatalkan transaksi yang sedang berlangsung dan memiliki peran bigquery.admin
, Anda dapat mengeluarkan pernyataan rollback menggunakan ID sesi yang terkait dengan transaksi di Cloud Shell atau dengan panggilan API. Saat Anda menjalankan kueri, menggunakan ID sesi yang terkait dengan transaksi, ID sesi tersebut akan ditampilkan dalam hasil.
Sesi contoh
Ini adalah contoh alur kerja sesi di Konsol Google Cloud:
Di konsol Google Cloud, buka tab editor baru dan buat sesi.
Di tab editor, tambahkan kueri berikut:
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a; SELECT * FROM Flights;
Jalankan kueri Tabel sementara bernama
Flights
dibuat dan semua data ditampilkan.+-------+ | total | +-------+ | 55 | | 23 | | 3 | | 14 | | 10 | +-------+
Hapus konten di dalam tab editor dan tambahkan kueri berikut:
SELECT * FROM Flights LIMIT 2;
Jalankan kueri Hasil untuk dua record ditampilkan. Meskipun Anda menghapus kueri sebelumnya, informasi dari kueri tersebut disimpan dalam sesi saat ini.
+-------+ | total | +-------+ | 55 | | 23 | +-------+
Hapus konten di dalam tab editor dan tambahkan kueri berikut:
DECLARE x INT64 DEFAULT 10; SELECT total * x AS total_a FROM Flights LIMIT 2; BEGIN SET x = 100; SELECT total * x AS total_b FROM Flights LIMIT 2; END; SELECT total * x AS total_c FROM Flights LIMIT 2;
Jalankan kueri Variabel cakupan sesi
x
digunakan untuk membatasi jumlah hasil yang ditampilkan untuk tabelFlights
. Perhatikan dengan cermat pengaruh pencakupan memengaruhi variabel ini saat dideklarasikan di luar pernyataanBEGIN...END
, yang ditetapkan di dalam pernyataanBEGIN...END
, lalu direferensikan di luar pernyataanBEGIN...END
lagi.+---------+ | total_a | +---------+ | 550 | | 230 | +---------+ +---------+ | total_b | +---------+ | 5500 | | 2300 | +---------+ +---------+ | total_c | +---------+ | 5500 | | 2300 | +---------+
Hapus konten di dalam tab editor dan tambahkan kueri berikut:
SELECT STRING(TIMESTAMP "2008-12-20 15:30:00+00", @@time_zone) AS default_time_zone; SET @@time_zone = "America/Los_Angeles"; SELECT STRING(TIMESTAMP "2008-12-20 15:30:00+00", @@time_zone) AS new_time_zone;
Jalankan kueri Variabel sistem cakupan sesi
@@time_zone
digunakan untuk menetapkan zona waktu ke stempel waktu. Pernyataan pertama menampilkan stempel waktu dengan zona waktu default (dalam contoh ini,UTC
). Pernyataan berikutnya menetapkan@@time_zone
ke nilai baru. Pernyataan ketiga menampilkan stempel waktu dengan zona waktu baru.+-------------------------------+ | default_time_zone | +-------------------------------+ | 2008-12-20 15:30:00+00 | +-------------------------------+ +-------------------------------+ | new_time_zone | +-------------------------------+ | 2008-12-20 07:30:00-08 | +-------------------------------+