Tampilan materialisasi real-time mengumpulkan data dari tabel dasar dan menyimpan hasil agregasi. Hal ini mengurangi beban komputasi serta meningkatkan kinerja query secara signifikan dengan memanfaatkan tampilan materialisasi. Topik ini menjelaskan cara menggunakan tampilan materialisasi di Hologres.
Informasi latar belakang
Tidak perlu memperbarui tampilan materialisasi secara manual di Hologres. Ketika data ditulis ke tabel dasar, data tersebut di-aggregasi ke tampilan materialisasi secara real-time dan dapat langsung di-query melalui tampilan materialisasi.
Tabel yang ditulis secara real-time disebut tabel dasar. Pengguna melakukan operasi INSERT, UPDATE, dan DELETE pada tabel dasar. Tampilan materialisasi didefinisikan berdasarkan aturan agregasi. Saat tabel dasar dimodifikasi, perubahan tersebut disinkronkan ke tampilan materialisasi secara real-time. Namun, hanya perubahan terkait operasi INSERT yang dapat disinkronkan.
Batasan
Untuk menggunakan tampilan materialisasi, jangan lakukan operasi DELETE atau UPDATE pada tabel dasar. Anda harus mengonfigurasi properti
appendonlyuntuk tabel dasar. Dengan cara ini, jika Anda melakukan operasi DELETE atau UPDATE pada tabel dasar, pesan kesalahanTable XXX is append-onlyakan dikembalikan. Jika Anda menggunakan Flink untuk menulis data ke tabel dasar secara real-time, setel parametermutateTypemenjadi InsertOrIgnore.Anda tidak dapat membuat tampilan materialisasi untuk tabel yang sudah ada. Definisikan tampilan materialisasi saat membuat tabel.
Tampilan materialisasi hanya dapat dibuat untuk satu tabel. Ekspresi tabel umum (CTE), operasi JOIN multi-tabel, subquery, serta klausa WHERE, ORDER BY, LIMIT, dan HAVING tidak didukung.
Kunci dan nilai GROUP BY dari tampilan materialisasi tidak boleh berupa ekspresi. Contohnya,
SUM(CASE WHEN COND THEN A ELSE B END),SUM(col1 + col2), danGROUP BY date_trunc('hour', ts)tidak dapat digunakan sebagai kunci atau nilai GROUP BY.Maksimal 10 tampilan materialisasi dapat dibuat untuk setiap tabel dasar. Semakin banyak tampilan materialisasi, semakin besar konsumsi sumber daya.
Jika Anda membuat tampilan materialisasi untuk tabel partisi, kunci GROUP BY dari tampilan materialisasi harus mencakup kolom kunci partisi tabel partisi. Tampilan materialisasi hanya dapat dibuat untuk tabel partisi induk, bukan tabel partisi anak.
Jika Anda membuat tampilan materialisasi untuk tabel partisi, Anda tidak dapat mengeksekusi pernyataan
ATTACH PARTITIONuntuk melampirkan partisi ke tabel partisi induk. Namun, Anda dapat mengeksekusi pernyataanCREATE TABLE PARTITION OFuntuk membuat partisi.Setelah membuat tampilan materialisasi untuk tabel dasar, Anda tidak dapat mengeksekusi pernyataan
DROP COLUMNuntuk menghapus kolom dari tabel dasar.Data dasar tampilan materialisasi memiliki waktu hidup (TTL) yang sama dengan tabel dasar tempat tampilan materialisasi dibuat. Jangan mengonfigurasi TTL secara manual untuk tampilan materialisasi. Jika tidak, data dalam tampilan materialisasi mungkin menjadi tidak konsisten dengan data dalam tabel dasar.
Fungsi agregat yang didukung
Tampilan materialisasi mendukung fungsi agregat berikut:
SUM
COUNT
AVG
MIN
MAX
RB_BUILD_CARDINALITY_AGG: Hanya mendukung tipe data BIGINT. Selain itu, Anda harus membuat ekstensi bitmap roaring.
Pernyataan SQL contoh
Buat tampilan materialisasi.
BEGIN; CREATE TABLE base_sales( day text not null, hour int , ts timestamptz, amount float, pk text not null primary key ); CALL SET_TABLE_PROPERTY('base_sales', 'mutate_type', 'appendonly'); -- Setelah tampilan materialisasi dihapus, Anda dapat mengeksekusi pernyataan berikut untuk membatalkan properti appendonly untuk tabel dasar: --CALL SET_TABLE_PROPERTY('base_sales', 'mutate_type', 'none'); CREATE MATERIALIZED VIEW mv_sales AS SELECT day, hour, avg(amount) AS amount_avg FROM base_sales GROUP BY day, hour; COMMIT; insert into base_sales values(to_char(now(),'YYYYMMDD'),'12',now(),100,'pk1'); insert into base_sales values(to_char(now(),'YYYYMMDD'),'12',now(),200,'pk2'); insert into base_sales values(to_char(now(),'YYYYMMDD'),'12',now(),300,'pk3');Buat tampilan materialisasi untuk tabel partisi.
BEGIN; CREATE TABLE base_sales_p( day text not null, hour int, ts timestamptz, amount float, pk text not null, primary key (day, pk) ) partition by list(day); CALL SET_TABLE_PROPERTY('base_sales_p', 'mutate_type', 'appendonly'); -- day adalah kolom kunci partisi. Kolom ini harus disertakan dalam kondisi klausa GROUP BY dari tampilan materialisasi. CREATE MATERIALIZED VIEW mv_sales_p AS SELECT day, hour, avg(amount) AS amount_avg FROM base_sales_p GROUP BY day, hour; COMMIT; create table base_sales_20220101 partition of base_sales_p for values in('20220101');Query tampilan materialisasi.
SELECT * FROM mv_sales WHERE day = to_char(now(),'YYYYMMDD') AND hour = 12;Hapus tampilan materialisasi.
DROP MATERIALIZED VIEW mv_sales;Query ruang penyimpanan yang digunakan oleh tampilan materialisasi.
select pg_relation_size('mv_sales');Query ruang penyimpanan yang digunakan oleh semua tampilan materialisasi.
SELECT schemaname || '.' || matviewname AS mv_full_name, pg_size_pretty(pg_relation_size('"' || schemaname || '"."' || matviewname || '"')) AS mv_size, pg_relation_size('"' || schemaname || '"."' || matviewname || '"') AS order_size FROM pg_matviews ORDER BY order_size DESC;
Tingkatkan kinerja komputasi UV presisi menggunakan tampilan materialisasi
Komputasi pengunjung unik (UV) presisi adalah operator dengan kompleksitas komputasi tinggi dan sering kali menjadi hambatan kinerja sistem. Hologres mendukung fungsi agregat RB_BUILD_CARDINALITY_AGG. Dengan menggunakan struktur data bitmap roaring, Hologres dapat mengumpulkan data tipe BIGINT ke dalam tampilan materialisasi. Tipe BIGINT biasanya digunakan oleh bidang ID bisnis. Ini mengimplementasikan deduplikasi real-time statistik UV. Anda dapat membuat tampilan materialisasi dengan mengeksekusi pernyataan berikut. Hanya bidang tipe BIGINT yang didukung untuk agregasi dan deduplikasi.
-- Komputasi UV bergantung pada tipe data bitmap roaring. Anda harus membuat ekstensi bitmap roaring terlebih dahulu.
CREATE EXTENSION if not exists roaringbitmap;
BEGIN;
CREATE TABLE base_sales_r(
day text not null,
hour int ,
ts timestamptz,
amount float,
userid bigint,
pk text not null primary key
);
CALL SET_TABLE_PROPERTY('base_sales_r', 'mutate_type', 'appendonly');
CREATE MATERIALIZED VIEW mv_sales_r AS
SELECT
day,
hour,
avg(amount) AS amount_avg,
rb_build_cardinality_agg(userid) as user_count
FROM base_sales_r
GROUP BY day, hour;
COMMIT;
insert into base_sales_r values(to_char(now(),'YYYYMMDD'),'12',now(),100,1,'pk1');
insert into base_sales_r values(to_char(now(),'YYYYMMDD'),'12',now(),200,2,'pk2');
insert into base_sales_r values(to_char(now(),'YYYYMMDD'),'12',now(),300,3,'pk3');
select user_count as UV from mv_sales_r where day = to_char(now(),'YYYYMMDD') AND hour = 12;Fungsi agregat RB_BUILD_CARDINALITY_AGG digunakan untuk menghitung nilai UV. Di dalam tampilan mv_sales_r, bidang user_count menyimpan nilai UV untuk bidang userid. Anda dapat menanyakan bidang user_count untuk mendapatkan nilai UV.
Lakukan query agregat multi-dimensi menggunakan tampilan materialisasi
Dalam contoh ini, tampilan materialisasi mv_sales digunakan. Tabel berikut menggambarkan data yang terkandung dalam tabel dasar base_sales.
Hari | Jam | Jumlah | PK |
20210101 | 12 | 2 | pk1 |
20210101 | 12 | 4 | pk2 |
20210101 | 13 | 6 | pk3 |
Hasil berikut dikembalikan jika Anda langsung menanyakan tampilan materialisasi sales_mv:
postgres=> select * from mv_sales;
day | hour | amount_avg
-----------+---------+--------------
20210101 | 12 | 3
20210101 | 13 | 6Jika Anda menanyakan tampilan materialisasi dari dimensi agregasi, hasil yang salah akan dikembalikan. Sebagai contoh, jika Anda menggunakan fungsi AVG untuk mengumpulkan data dalam tampilan materialisasi berdasarkan hari, hasil yang salah akan dikembalikan. Hal ini karena rata-rata dari nilai rata-rata tidak sama dengan rata-rata dari nilai asli.
postgres=> select day, avg(amount_avg) from mv_sales group by day;
day | avg
-----------+--------
20210101 | 4.5Dalam kasus ini, Anda dapat membuat tampilan materialisasi lain yang di-agregasi berdasarkan hari. Namun, ini akan meningkatkan jumlah tampilan materialisasi. Hologres memungkinkan Anda menggunakan satu tampilan materialisasi untuk mengimplementasikan query agregat dalam dimensi berbeda berdasarkan hasil agregasi dalam keadaan antara. Dalam contoh berikut, fungsi agregat AVG digunakan. Eksekusi pernyataan DDL yang dimodifikasi berikut untuk membuat tampilan materialisasi:
BEGIN;
CREATE TABLE base_sales(
day text not null,
hour int ,
ts timestamptz,
amount float,
pk text not null primary key
);
CALL SET_TABLE_PROPERTY('base_sales', 'mutate_type', 'appendonly');
CREATE MATERIALIZED VIEW mv_sales_partial AS
SELECT
day,
hour,
avg(amount) as avg,
avg_partial(amount) AS amt_avg_partial
FROM base_sales
GROUP BY day, hour;
COMMIT;Seperti yang ditunjukkan dalam pernyataan, fungsi agregat AVG diganti dengan fungsi agregat AVG_PARTIAL. Kolom amount_avg_partial menyimpan hasil agregasi dalam keadaan antara. Anda dapat menggunakan fungsi agregat AVG_FINAL untuk menanyakan agregasi akhir dari hasil agregasi dalam keadaan antara.
postgres=> select day, avg(avg) as avg_avg, avg_final(amt_avg_partial) as real_avg from mv_sales_partial group by day;
day | avg_avg | real_avg
-----------+-----------+----------
20210101 | 4.5 | 4Tabel berikut menggambarkan fungsi agregat dan fungsi agregat parsial serta akhirnya yang didukung.
Fungsi agregat | Fungsi agregat parsial | Fungsi agregat akhir |
AVG | AVG_PARTIAL | AVG_FINAL |
RB_BUILD_CARDINALITY_AGG | RB_BUILD_AGG | RB_OR_CARDINALITY_AGG |
Tentang TTL
Jika TTL diatur untuk tabel dasar dan tampilan materialisasi dibuat, Hologres tidak dapat menjamin konsistensi antara hasil query jika Anda menanyakan tabel dasar dan tampilan materialisasi untuk data yang akan kedaluwarsa. Hasil menanyakan data yang akan kedaluwarsa dari tampilan materialisasi tidak terdefinisi. Dalam contoh berikut, tabel dasar base_sales_table dan tampilan materialisasi sales_mv digunakan.
TTL diatur untuk tabel dasar base_sales_table, dan beberapa data telah kedaluwarsa. Jika Anda menanyakan tabel dasar, hasil query berikut dikembalikan:
postgres=> SELECT
day,
hour,
avg(amount) AS amount_avg
FROM base_sales
GROUP BY day, hour;
-- Hasil query
day | hour | amount_avg
-----------+---------+--------------
20210101 | 12 | 4
20210101 | 13 | 6Namun, data yang kedaluwarsa telah dimaterialisasi ke dalam tampilan materialisasi. Hasil query berikut mungkin dikembalikan jika Anda menanyakan tampilan materialisasi:
postgres=> select * from mv_sales;
-- Hasil query
day | hour | amount_avg
-----------+---------+--------------
20210101 | 12 | 3
20210101 | 13 | 6Dalam kasus ini, hasil query tidak konsisten. Kami merekomendasikan langkah-langkah berikut:
Jangan atur TTL untuk tabel dasar.
Jika TTL diatur untuk tabel dasar dan bidang waktu termasuk dalam kunci GROUP BY dari tampilan materialisasi, jangan menanyakan tampilan materialisasi untuk data yang akan kedaluwarsa.
Buat tabel dasar sebagai tabel partisi. Jangan atur TTL untuk tabel dasar. Hapus data yang kedaluwarsa dengan menghapus tabel partisi anak.
Praktik terbaik untuk menggunakan tampilan materialisasi real-time
Saat membuat tabel, kami merekomendasikan Anda menyetel kunci GROUP BY dari tampilan materialisasi menjadi kunci distribusi tabel dasar. Ini meningkatkan rasio kompresi data dan kinerja query.
Letakkan kondisi filter yang sering digunakan dalam query tampilan materialisasi di depan kunci GROUP BY berdasarkan prinsip pencocokan paling kiri dari kunci kluster.
Perutean cerdas untuk tampilan materialisasi
Anda tidak perlu secara eksplisit menentukan tampilan materialisasi untuk di-query. Anda dapat melakukan query berdasarkan tabel dasar seperti biasa. Jika tampilan materialisasi yang cocok tersedia, pengoptimal secara cerdas merutekan query ke tampilan materialisasi yang paling sesuai untuk mempercepat query. Hologres memilih tampilan materialisasi berdasarkan aturan berikut:
Hologres memilih tampilan materialisasi yang berisi semua kolom yang di-query atau kolom yang dapat digunakan untuk menghitung nilai kolom yang di-query.
Hologres memilih tampilan materialisasi yang kunci GROUP BY-nya berisi semua kolom yang ditentukan dalam kunci GROUP BY dari query asli.
Jika beberapa tampilan materialisasi memenuhi persyaratan, Hologres memilih tampilan materialisasi yang berisi bidang paling sedikit dalam kunci GROUP BY.
Fungsi agregat yang mendukung perutean cerdas termasuk SUM, COUNT, MIN, dan MAX.