Kueri tampilan terwujud berkelanjutan

Untuk membuat tampilan terwujud berkelanjutan dari tabel Bigtable, Anda menjalankan kueri SQL yang menentukan tampilan terwujud berkelanjutan.

Dokumen ini menjelaskan konsep dan pola untuk membantu Anda menyiapkan kueri SQL tampilan terwujud berkelanjutan. Sebelum membaca dokumen ini, Anda harus memahami Tampilan terwujud berkelanjutan dan GoogleSQL untuk Bigtable.

Tampilan terwujud berkelanjutan menggunakan sintaksis SQL terbatas. Pola berikut menunjukkan cara membuat kueri SQL tampilan terwujud berkelanjutan:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
GROUP BY expression [, ...];

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Jika Anda ingin membuat kueri SQL tampilan terwujud berkelanjutan sebagai indeks sekunder global, gunakan klausa ORDER BY:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
ORDER BY expression [, ...];

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Batasan kueri

Aturan berikut berlaku untuk kueri SQL yang digunakan untuk membuat tampilan terwujud berkelanjutan:

  • Harus berupa pernyataan SELECT.
  • Harus memiliki klausa GROUP BY atau, untuk kueri indeks sekunder global, klausa ORDER BY, tetapi tidak keduanya.
  • Hanya boleh menggunakan fungsi agregasi yang didukung.
  • Dapat memiliki beberapa agregasi per grup.

Agregasi yang didukung

Anda dapat menggunakan fungsi agregasi berikut dalam kueri SQL yang menentukan tampilan terwujud berkelanjutan:

  • COUNT
  • SUM
  • MIN
  • MAX
  • HLL_COUNT.INIT
  • HLL_COUNT.MERGE
  • HLL_COUNT.MERGE_PARTIAL
  • ANY_VALUE
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • AVG

Jika Anda SELECT COUNT(*), Anda harus menentukan kunci baris, seperti dalam contoh berikut:

SELECT
  '*' AS _key,
  COUNT(*) AS count
FROM
  foo
GROUP BY
  _key;

Fitur SQL yang tidak didukung

Anda tidak dapat menggunakan fitur SQL berikut:

  • Fitur apa pun yang tidak didukung oleh GoogleSQL untuk Bigtable
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME dan fungsi non-deterministik lainnya
  • DATE, DATETIME sebagai kolom output (Gunakan TIMESTAMP atau simpan string.)
  • Urutan DESC dalam output
  • Opsi DISTINCT, seperti pada SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • SELECT *
  • Klausul OVER untuk membuat agregasi windowing
  • STRUCT

Anda juga tidak dapat menyarangkan klausa GROUP BY atau ORDER BY atau membuat kolom peta. Untuk batasan tambahan, lihat Batasan.

Menghindari baris yang dikecualikan

Baris input dikecualikan dari tampilan terwujud berkelanjutan dalam kondisi berikut:

  • Lebih dari 1 MiB data dipilih dari baris. Misalnya, jika kueri Anda adalah SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples, maka setiap baris yang berisi lebih dari 1 MiB data di kolom apple dan banana akan dikecualikan dari tampilan materialis berkelanjutan.
  • Lebih dari 1 MiB data dikeluarkan dari baris. Hal ini dapat terjadi saat Anda menggunakan kueri seperti SELECT REPEAT(apple, 1000) atau menggunakan konstanta besar.
  • Data yang dihasilkan lebih dari 10 kali lipat dari data yang dipilih.
  • Kueri tidak cocok dengan data Anda. Hal ini mencakup upaya untuk membagi nol, meluapnya bilangan bulat, atau mengharapkan format kunci baris yang tidak digunakan di setiap kunci baris.

Baris yang dikecualikan akan meningkatkan metrik error pengguna saat pertama kali diproses. Untuk mengetahui informasi selengkapnya tentang metrik yang dapat membantu Anda memantau tampilan terwujud berkelanjutan, lihat Metrik.

Detail kueri

Bagian ini menjelaskan kueri tampilan terwujud berkelanjutan dan tampilan hasilnya saat kueri tampilan dijalankan. Data dalam tabel sumber adalah input, dan data hasil dalam tampilan materialis berkesinambungan adalah output. Data output digabungkan atau tidak digabungkan (dalam kunci yang ditentukan).

Pernyataan SELECT

Pernyataan pemilihan mengonfigurasi kolom dan agregasi yang digunakan dalam tampilan terwujud berkelanjutan. Pernyataan harus menggunakan klausa GROUP BY untuk menggabungkan baris atau klausa ORDER BY untuk membuat indeks sekunder global.

SELECT * tidak didukung, tetapi SELECT COUNT(*) didukung.

Seperti dalam pernyataan SELECT biasa, Anda dapat memiliki beberapa agregasi per kumpulan data yang dikelompokkan. Kolom yang tidak dikelompokkan harus berupa hasil agregasi.

Berikut adalah contoh kueri agregasi GROUP BY standar dalam SQL:

SELECT
  myfamily["node"] AS node,
  myfamily["type"] AS type,
  COUNT(clicks) AS clicks_per_key
FROM
  mytable
GROUP BY
  node,
  type

Kunci baris dan data yang tidak diagregasi

Anda dapat menentukan _key sebagai kunci baris untuk tampilan terwujud berkelanjutan. Jika tidak, kolom dalam klausa GROUP BY akan membentuk kunci dalam tampilan.

Kunci baris yang ditentukan oleh kolom _key

Secara opsional, Anda dapat menentukan kolom _key saat menentukan tampilan terwujud berkelanjutan. (Ini berbeda dengan kolom _keyyang Anda dapatkan saat menjalankan kueri SQL pada tabel Bigtable.) Jika Anda menentukan _key, aturan berikut berlaku:

  • Anda harus mengelompokkan menurut _key, dan Anda tidak dapat mengelompokkan menurut hal lain kecuali (opsional) menurut _timestamp. Untuk mengetahui informasi selengkapnya, lihat Stempel waktu.
  • Kolom _key harus berjenis BYTES.

Menentukan _key berguna jika Anda berencana membaca tampilan dengan ReadRows daripada dengan SQL, karena memberi Anda kontrol atas format kunci baris. Di sisi lain, kueri SQL ke tampilan dengan _key yang ditentukan mungkin perlu mendekode _key secara eksplisit, bukan hanya menampilkan kolom kunci terstruktur.

Kunci baris yang ditentukan oleh klausa GROUP BY atau ORDER BY

Jika Anda tidak menentukan _key, kolom yang tidak diagregasi dalam daftar SELECT akan menjadi kunci baris dalam tampilan. Anda dapat menetapkan nama apa pun untuk kolom kunci yang didukung oleh konvensi SQL. Gunakan pendekatan ini jika Anda berencana menggunakan SQL untuk membuat kueri tampilan, bukan permintaan ReadRows.

Kolom output yang tidak digabungkan dalam daftar SELECT harus disertakan dalam klausa GROUP BY. Urutan penulisan kolom dalam klausa GROUP BY adalah urutan penyimpanan data dalam kunci baris tampilan materialis berkesinambungan. Misalnya, GROUP BY a, b, c secara implisit adalah ORDER BY a ASC, b ASC, c ASC.

Jika Anda menggunakan klausa ORDER BY, bukan klausa GROUP BY, untuk membuat indeks sekunder global, kolom dalam daftar SELECT yang merupakan bagian dari klausa ORDER BY akan menjadi kunci baris dalam tampilan. Urutan penulisan kolom dalam klausa ORDER BY adalah urutan penyimpanan data dalam kunci baris tampilan terwujud berkelanjutan. Misalnya, ORDER BY a, b, c menyimpan data dengan kunci baris yang diurutkan berdasarkan a ASC, lalu b ASC, lalu c ASC.

Filter SQL Anda harus menghilangkan potensi NULL atau nilai tidak valid lainnya yang dapat menyebabkan kesalahan. Baris yang tidak valid, seperti yang berisi kolom kunci NULL, akan dihapus dari hasil dan dihitung dalam metrik materialized_view/user_errors. Untuk men-debug error pengguna, coba jalankan kueri SQL di luar tampilan terwujud berkelanjutan.

Data gabungan

Kolom gabungan dalam kueri menentukan penghitungan yang menghasilkan data dalam tampilan terwujud berkelanjutan.

Alias untuk kolom gabungan diperlakukan sebagai kualifikasi kolom dalam tampilan terwujud berkelanjutan.

Perhatikan contoh berikut:

SELECT
  fam["baz"] AS baz,
  SUM(fam["foo"]) AS sum_foo,
  SUM(fam["bar"]) AS sum_bar
FROM
  TABLE

GROUP BY
  baz;

Output kueri memiliki karakteristik berikut:

  • Output untuk setiap baz berada di baris terpisah dalam urutan baz ASC.
  • Jika baz tertentu memiliki setidaknya satu foo, maka sum_foo baris output adalah nilai non-NULL.
  • Jika baz tertentu memiliki setidaknya satu bar, maka sum_bar baris output adalah nilai non-NULL.
  • Jika baz tertentu tidak memiliki nilai untuk salah satu kolom, baz tersebut akan dihilangkan dari hasil.

Kemudian, jika Anda mengkueri tampilan dengan SELECT *, hasilnya akan terlihat seperti berikut:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

Stempel waktu

Stempel waktu default untuk sel output dalam tampilan terwujud berkelanjutan adalah 0 (1970-01-01 00:00:00Z). Hal ini terlihat saat Anda membaca tampilan dengan ReadRows dan bukan saat Anda membuat kueri dengan SQL.

Untuk menggunakan stempel waktu yang berbeda dalam output, Anda dapat menambahkan kolom jenis TIMESTAMP ke daftar SELECT kueri dan menamainya _timestamp. Jika Anda membuat kueri tampilan terwujud berkelanjutan menggunakan ReadRows, _timestamp akan menjadi stempel waktu untuk sel lain dalam baris.

Stempel waktu tidak boleh NULL, harus lebih besar dari atau sama dengan nol, dan harus merupakan kelipatan 1.000 (presisi milidetik). Bigtable tidak mendukung stempel waktu sel yang lebih awal dari epoch Unix (1970-01-01T00:00:00Z).

Pertimbangkan contoh berikut, yang melakukan pengambilan sampel ulang data gabungan menurut hari. Kueri menggunakan fungsi UNPACK.

SELECT
  _key,
  TIMESTAMP_TRUNC(_timestamp, DAY) AS _timestamp,
  SUM(sum_family["sum_column"]) AS sum_column,
  SUM(sum_family["foo"]) AS second_sum_column
FROM
  UNPACK(
  SELECT
    *
  FROM
    my_table(with_history => TRUE))
GROUP BY
  1,
  2

Jika SUM tertentu memiliki input yang tidak kosong untuk hari tertentu, baris output berisi nilai gabungan dengan stempel waktu yang cocok dengan hari yang dipangkas.

Jika Anda mengkueri tampilan dengan SELECT *, hasilnya akan terlihat mirip dengan berikut:

_key _timestamp sum_column second_sum_column
1 2024-05-01 00.00.00Z 23 99
2 2024-05-02 00.00.00Z 45 201
3 2024-05-03 00.00.00Z NULL 56
4 2024-05-04 00:00:00Z 8 NULL

Encoding

Jika Anda mengkueri tampilan terwujud berkelanjutan dengan SQL, Anda tidak perlu mengetahui cara nilai gabungan dienkode karena SQL mengekspos hasilnya sebagai kolom yang diketik.

Jika Anda membaca dari tampilan menggunakan ReadRows, Anda perlu mendekode data gabungan dalam permintaan baca Anda. Untuk mengetahui informasi selengkapnya tentang permintaan ReadRows, lihat Baca.

Nilai gabungan dalam tampilan terwujud berkelanjutan disimpan menggunakan encoding yang dijelaskan dalam tabel berikut, berdasarkan jenis output kolom dari definisi tampilan.

Type Encoding
BOOL Nilai 1 byte, 1 = benar, 0 = salah
BYTES Tidak ada encoding
INT64 (atau INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big-endian 64-bit
FLOAT64 IEEE 754 64-bit, tidak termasuk NaN dan +/-inf
STRING UTF-8
WAKTU/STEMPEL WAKTU Bilangan bulat 64-bit yang merepresentasikan jumlah mikrodetik sejak epoch Unix (konsisten dengan GoogleSQL)
Untuk mengetahui informasi selengkapnya, lihat Encoding dalam referensi Data API.

Langkah berikutnya