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, klausaORDER 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 lainnyaDATE
,DATETIME
sebagai kolom output (GunakanTIMESTAMP
atau simpan string.)- Urutan
DESC
dalam output - Opsi
DISTINCT
, seperti padaSUM(*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 kolomapple
danbanana
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 _key
yang 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 berjenisBYTES
.
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 urutanbaz ASC
. - Jika
baz
tertentu memiliki setidaknya satufoo
, makasum_foo
baris output adalah nilai non-NULL. - Jika
baz
tertentu memiliki setidaknya satubar
, makasum_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) |
Langkah berikutnya
- Membuat dan mengelola tampilan terwujud berkelanjutan
- Dokumentasi referensi GoogleSQL untuk Bigtable