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 ke NULL, 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 tersebut dapat diberi 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 blok BEGIN...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 dikenakan biaya untuk penyimpanan tabel sementara saat sesi aktif. Untuk informasi lebih lanjut 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:

  1. Di konsol Google Cloud, buka tab editor baru dan buat sesi.

  2. 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;
    
  3. Jalankan kueri Tabel sementara bernama Flights dibuat dan semua data ditampilkan.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    |     3 |
    |    14 |
    |    10 |
    +-------+
    
  4. Hapus konten di dalam tab editor dan tambahkan kueri berikut:

    SELECT * FROM Flights LIMIT 2;
    
  5. Jalankan kueri Hasil untuk dua record ditampilkan. Meskipun Anda menghapus kueri sebelumnya, informasi dari kueri tersebut disimpan dalam sesi saat ini.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    +-------+
    
  6. 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;
    
  7. Jalankan kueri Variabel cakupan sesi x digunakan untuk membatasi jumlah hasil yang ditampilkan untuk tabel Flights. Perhatikan dengan cermat pengaruh pencakupan memengaruhi variabel ini saat dideklarasikan di luar pernyataan BEGIN...END, yang ditetapkan di dalam pernyataan BEGIN...END, lalu direferensikan di luar pernyataan BEGIN...END lagi.

    +---------+
    | total_a |
    +---------+
    |     550 |
    |     230 |
    +---------+
    
    +---------+
    | total_b |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
    +---------+
    | total_c |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
  8. 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;
    
  9. 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-25 15:30:00+00        |
    +-------------------------------+
    
    +-------------------------------+
    | new_time_zone                 |
    +-------------------------------+
    | 2008-12-20 07:30:00-08        |
    +-------------------------------+
    

Langkah selanjutnya