Anda dapat menggunakan pernyataan CREATE PARTITION TABLE untuk membuat tabel terpartisi. Topik ini menjelaskan cara menggunakan pernyataan tersebut.
Deskripsi
Kecuali dinyatakan lain, tabel induk yang disebutkan dalam topik ini mengacu pada tabel induk terpartisi, dan tabel anak mengacu pada tabel anak terpartisi.
Tabel induk dipartisi menjadi beberapa tabel anak berdasarkan nilai kunci partisi. Data di tabel anak tersedia secara publik. Sebelum menggunakan tabel terpartisi, Anda harus membuat tabel anak terlebih dahulu. Anda dapat menggunakan pernyataan CREATE PARTITION TABLE untuk membuat tabel terpartisi. Selain itu, Anda dapat mengaktifkan partisi dinamis agar tabel anak dibuat secara otomatis.
Tabel anak dari tabel terpartisi disimpan dalam file yang berbeda. Untuk menanyakan data dalam tabel terpartisi, Anda harus menentukan partisi. Dengan cara ini, sistem tidak perlu memindai semua partisi dalam tabel dan dapat dengan cepat menemukan file yang diinginkan, meningkatkan efisiensi. Umumnya, tabel fakta dibagi menjadi partisi berdasarkan tanggal. Tabel anak dari tabel terpartisi setara dengan tabel non-partisi dalam penyimpanan metadata. Oleh karena itu, sejumlah besar partisi dapat menyebabkan volume metadata meningkat serta menghasilkan banyak file kecil dan fragmen.
Jika sumber data Anda adalah database, kami sarankan untuk tidak menggunakan tabel terpartisi. Jika digunakan dalam skenario ini, partisi yang berlebihan dapat menyia-nyiakan sumber daya I/O. Untuk mengatasi masalah ini dan menerapkan percepatan kueri berbasis indeks, Anda dapat menentukan bidang partisi yang sering digunakan untuk membentuk kunci segmen.
Batasan
Hologres hanya mengizinkan impor data ke tabel anak, bukan tabel induk.
CatatanRealtime Compute for Apache Flink memungkinkan Anda mengimpor data ke tabel induk di Hologres secara real-time. Untuk informasi lebih lanjut, lihat Tulis data ke tabel hasil terpartisi di Hologres secara real-time.
Setiap aturan partisi hanya dapat digunakan untuk membuat satu tabel terpartisi.
Klausa
PARTITION BYhanya mendukunglist partitioning. Kunci partisi harus berupa kolom tunggal.Jika tabel terpartisi memiliki kunci utama, kunci partisi harus merupakan subset dari kunci utama.
Catatan Penggunaan
Jika jumlah catatan data dalam satu hari kurang dari 100 juta, kami sarankan untuk tidak menggunakan tanggal sebagai kondisi partisi atau membuat tabel terpartisi berdasarkan tanggal. Jika tidak, ukuran setiap partisi akan kecil dan kueri tidak akan dipercepat secara signifikan. Kami sarankan menentukan granularitas yang lebih kasar.
Jika Anda perlu sering mengganti data partisi dengan melakukan operasi TRUNCATE atau DROP, kami sarankan menggunakan tabel terpartisi. Dalam skenario ini, Anda dapat melakukan operasi TRUNCATE atau DROP secara lebih efisien tanpa perlu memindai sejumlah besar data.
Buat tabel terpartisi
Sintaksis
Gunakan pernyataan berikut untuk membuat tabel terpartisi:
-- Buat tabel induk.
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> ([
{
<column_name> <column_type> [ <column_constraints>, [...]]
| <table_constraints>
[, ...]
}
])
PARTITION BY LIST(<column_name>);
-- Buat tabel anak.
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> PARTITION OF <parent_table>
FOR VALUES IN (<string_literal>);Parameter
Tabel berikut menjelaskan parameter dalam sintaksis sebelumnya.
Parameter | Deskripsi |
if not exists | Menentukan bahwa jika tabel dengan nama yang sama sudah ada, sistem tidak mengembalikan pesan kesalahan tetapi memberi tahu Anda bahwa tabel sudah ada. |
schema_name | Nama skema tempat tabel berada. Jika Anda membuat tabel induk dan tabel anak dalam skema yang sama, Anda tidak perlu menentukan nama skema. Jika Anda membuat tabel induk dan tabel anak lintas skema, Anda harus menentukan nama skema. |
table_name | Nama tabel induk atau tabel anak yang ingin Anda buat. |
column_name | Nama kolom yang ingin Anda buat di tabel baru. |
column_type | Tipe data kolom. |
column_constraints | Nama batasan kolom. |
table_constraints | Nama batasan tabel. |
parent_table | Nama tabel induk dari tabel anak. |
string_literal | Kunci partisi. |
Kolom dengan tipe data TEXT, VARCHAR, dan INT dapat digunakan sebagai kolom kunci partisi. Di Hologres V1.3.22 dan versi selanjutnya, kolom dengan tipe data DATE juga dapat digunakan sebagai kolom kunci partisi.
Contoh
Contoh 1: Buat tabel induk tanpa kunci utama dan tabel anaknya di skema publik.
Sintaksis yang didukung di Hologres V2.1 dan versi selanjutnya:
BEGIN; CREATE TABLE public.hologres_parent ( a TEXT, b INT, c TIMESTAMP, d TEXT ) PARTITION BY LIST (a) WITH (orientation = 'column'); CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN ('v1'); CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN ('v2'); CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN ('v3'); COMMIT;Sintaksis yang didukung di semua versi Hologres:
BEGIN; CREATE TABLE public.hologres_parent( a TEXT, b INT, c TIMESTAMP, d TEXT ) PARTITION BY LIST(a); CALL set_table_property('public.hologres_parent', 'orientation', 'column'); CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN('v1'); CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN('v2'); CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN('v3'); COMMIT;
Contoh 2: Buat tabel induk dengan kunci utama dan tabel anaknya di skema publik.
Sintaksis yang didukung di Hologres V2.1 dan versi selanjutnya:
BEGIN; CREATE TABLE public.hologres_parent_2 ( a TEXT, b INT, c TIMESTAMP, d TEXT, ds TEXT, PRIMARY KEY (ds, b) ) PARTITION BY LIST (ds) WITH (orientation = 'column'); CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201215'); CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201216'); CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201217'); COMMIT;Sintaksis yang didukung di semua versi Hologres:
BEGIN; CREATE TABLE public.hologres_parent_2( a TEXT , b INT, c TIMESTAMP, d TEXT, ds TEXT, primary key(ds,b) ) PARTITION BY LIST(ds); CALL set_table_property('public.hologres_parent_2', 'orientation', 'column'); CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201215'); CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201216'); CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201217'); COMMIT;
Kueri semua tabel anak
Anda dapat menanyakan semua tabel anak dari tabel induk menggunakan salah satu metode berikut:
Kueri semua tabel anak dari tabel induk secara visual menggunakan HoloWeb.
Kueri semua tabel anak dari tabel induk dengan menjalankan pernyataan SQL berikut. Dalam pernyataan SQL, ubah parent_table_name sesuai dengan kebutuhan bisnis Anda.
SELECT nmsp_parent.nspname AS parent_schema, parent.relname AS parent, nmsp_child.nspname AS child_schema, child.relname AS child FROM pg_inherits JOIN pg_class parent ON pg_inherits.inhparent = parent.oid JOIN pg_class child ON pg_inherits.inhrelid = child.oid JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace WHERE parent.relname='parent_table_name';
Aturan pengaturan properti untuk tabel induk dan tabel anaknya
Tabel berikut menjelaskan aturan pengaturan properti yang berlaku ketika tabel anak dilampirkan ke tabel induk:
Harus konsisten dengan tabel induk: Properti tabel anak harus konsisten dengan tabel induk. Jika tidak, kesalahan akan dilaporkan saat tabel anak dilampirkan ke tabel induk. Dalam hal ini, kami sarankan membuat tabel anak menggunakan pernyataan CREATE TABLE LIKE.
Tidak perlu konsisten dengan tabel induk: Properti tabel anak dapat berbeda dari tabel induk. Jika properti tabel anak tidak ditentukan secara eksplisit, tabel anak mewarisi pengaturan properti yang sesuai dari tabel induk. Jika properti tabel anak ditentukan secara eksplisit, pengaturan properti tabel anak dipertahankan.
Harus mencakup kolom terindeks dari tabel induk: Kolom terindeks dari tabel anak harus mencakup kolom terindeks dari tabel induk. Kolom yang tidak ditentukan sebagai kolom terindeks untuk tabel induk dapat ditentukan secara eksplisit untuk tabel anak.
Kategori | Properti tabel | Deskripsi | Apakah tabel anak yang dibuat dengan menjalankan pernyataan CREATE TABLE PARTITION OF mewarisi pengaturan properti dari tabel induknya | Aturan yang berlaku ketika tabel anak dilampirkan ke tabel induk |
Properti tabel | orientation | Format penyimpanan tabel. | Ya | Harus konsisten dengan tabel induk. |
table_group | Grup tabel tempat tabel tersebut termasuk. Properti ini juga menentukan jumlah shard untuk grup tabel. | Ya | Harus konsisten dengan tabel induk. | |
time_to_live_in_seconds | Waktu hidup (TTL) data dalam tabel. | Ya | Tidak perlu konsisten dengan tabel induk.
| |
Indeks | primary key | Kunci utama tabel. | Ya | Harus konsisten dengan tabel induk. |
distribution_key | Kunci distribusi tabel. | Ya | Harus konsisten dengan tabel induk. | |
clustering_key | Kunci pengelompokan tabel. | Ya | Harus konsisten dengan tabel induk. | |
event_time_column | Kolom waktu acara tabel. | Ya | Harus konsisten dengan tabel induk. | |
bitmap_columns | Kolom pengkodean kamus tabel. | Ya | Tidak perlu konsisten dengan tabel induk. | |
dictionary_encoding_columns | Indeks bidang tabel. | Ya | Tidak perlu konsisten dengan tabel induk. | |
binlog_level | Menentukan apakah akan mengaktifkan binary logging. | Ya | Harus konsisten dengan tabel induk. | |
proxima_vectors | Indeks yang digunakan untuk melakukan pencarian vektor pada tabel. | Ya | Harus konsisten dengan tabel induk. | |
Batasan kolom | nullable | Batasan NOT NULL. | Ya | Harus konsisten dengan tabel induk. |
nilai default | Nilai default. | Ya | Harus konsisten dengan tabel induk. |
Referensi
Fitur partisi dinamis Hologres secara otomatis membuat dan mengelola tabel anak berdasarkan aturan partisi dinamis yang Anda konfigurasikan saat membuat tabel terpartisi. Anda tidak perlu mengonfigurasi semua partisi saat membuat tabel terpartisi. Untuk informasi lebih lanjut, lihat Partisi Dinamis.
Anda dapat menggunakan pernyataan
ALTER PARTITION TABLEuntuk memodifikasi partisi. Untuk informasi lebih lanjut, lihat ALTER PARTITION TABLE.Anda dapat menggunakan pernyataan
DROP PARTITION TABLEuntuk menghapus tabel terpartisi. Untuk informasi lebih lanjut, lihat CREATE/DROP PARTITION TABLE.