Bir tabloyu bölüm anahtarı sütununa göre alt tablolara ayırmak için CREATE PARTITION TABLE deyimini kullanın. Ana tablo, bölüm anahtar değerlerine göre farklı alt tablolara bölünür. Alt tablolardaki veriler herkese açıktır. Her alt tablo belirli bir bölüm değeri için satırlar içerir ve bölümlenmiş bir tablodaki verileri sorgulamak için sistemin eşleşmeyen bölümleri atlamasını sağlamak üzere bir bölüm belirtmeniz gerekir; bu işlem taranan veri miktarını azaltır.
Bu konuda "ana tablo" ifadesi ana bölümlenmiş tabloyu, "alt tablo" ifadesi ise alt bölümlenmiş tabloyu ifade eder.
Bölümlenmiş tablolar ne zaman kullanılır?
Bölüm eleme veya toplu veri işlemlerinden sağlanan fayda, birden fazla alt tabloyu yönetmenin ek yükünü açıkça aştığında bölümlenmiş tabloları kullanın.
Bölümlenmiş tabloları şu durumlarda kullanın:
Tek bir bölüm için günlük veri hacmi 100 milyon satırı aşarsa (tarih bazlı bölümlendirme için).
Bir bölümün tüm verilerini
TRUNCATEveyaDROPkullanarak toplu şekilde değiştirmeniz veya silmeniz gerekiyorsa; her iki işlem de alt tabloda anında tamamlanır ve tam taramalardan kaçınır.
Bölümlenmiş tabloları şu durumlarda kullanmaktan kaçının:
Veri kaynağı bir veritabanı sistemiyse. Aşırı sayıda bölüm G/Ç kaynaklarını boşa harcar. Bunun yerine, dizin tabanlı sorgu hızlandırmayı etkinleştirmek için sık kullanılan filtre sütunlarını segment anahtarı olarak belirtin.
Bölüm başına günlük veri hacmi 100 milyon satırın altındaysa. Küçük bölümler ihmal edilebilir düzeyde sorgu hızlandırma sağlar. Bunun yerine daha kaba bir granülerlik kullanın.
Şunu unutmayın: Her alt tablo ayrı bir dosya kümesi olarak depolanır ve meta veri depolama açısından bölümlenmemiş bir tabloya eşdeğerdir. Çok sayıda alt tablo, meta veri hacmini artırır ve çok sayıda küçük dosya ile parçalanmaya neden olur.
Sınırlamalar
-
Veriler doğrudan ana tabloya değil, alt tabloya yazılmalıdır.
Realtime Compute for Apache Flink, verileri ana tabloya gerçek zamanlı olarak yazabilir. Ayrıntılar için bkz. Write data to a partitioned Hologres sink table in real time .
Hologres yalnızca liste bölümlendirmeyi (
PARTITION BY LIST) destekler.Bölüm anahtarı tek bir sütun olmalıdır.
Her bölümlendirme kuralı yalnızca bir bölümlenmiş tablo oluşturmak için kullanılabilir.
Ana tablonun bir birincil anahtarı varsa, bölüm anahtarı sütunu bu birincil anahtarın bir parçası olmalıdır.
Bölümlenmiş tablo oluşturma
Bölümlenmiş bir tablo, şemayı ve bölüm kuralını tanımlayan bir ana tablo ile belirli bölüm değerlerini kapsayan bir veya daha fazla alt tablodan oluşur. Veri yazılmadan önce alt tabloların oluşturulması gerekir.
Alternatif olarak, Hologres'in yapılandırdığınız kurallara göre alt tabloları otomatik olarak oluşturmasını sağlamak için dynamic partitioning özelliğini etkinleştirin.
Söz dizimi
-- Create the parent table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> (
{
<column_name> <column_type> [<column_constraints> [, ...]]
| <table_constraints>
[, ...]
}
)
PARTITION BY LIST (<column_name>);
-- Create a child table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name>
PARTITION OF <parent_table>
FOR VALUES IN (<string_literal>);
Parametreler
| Parametre | Açıklama |
|---|---|
IF NOT EXISTS |
Aynı ada sahip bir tablo zaten varsa hatayı bastırır. |
schema_name |
Tabloyu içeren şema. Ana ve alt tablolar aynı şemadaysa bunu atlayın; şemalar arası oluşturma için gereklidir. |
table_name |
Oluşturulacak ana tablonun veya alt tablonun adı. |
column_name |
Sütunun adı. |
column_type |
Sütunun veri türü. |
column_constraints |
Sütun düzeyindeki kısıtlamalar (örneğin, NOT NULL). |
table_constraints |
Tablo düzeyindeki kısıtlamalar (örneğin, PRIMARY KEY). |
parent_table |
Alt tablonun ait olduğu ana tablonun adı. |
string_literal |
Alt tablo için bölüm anahtarı değeri. |
Bölüm anahtarı sütunları için desteklenen veri türleri:
| Veri türü | Desteklenen sürümler |
|---|---|
TEXT |
Tüm sürümler |
VARCHAR |
Tüm sürümler |
INT |
Tüm sürümler |
DATE |
Hologres V1.3.22 ve sonraki sürümler |
Örnekler
Aşağıdaki örneklerde, her alt tablonun bir günlük veriyi tuttuğu bölümlenmiş bir gerçek tablosu oluşturulmaktadır. Bir günün tüm verilerini verimli bir şekilde kesmek veya değiştirmek istediğinizde bu yaygın bir kalıptır.
Örnek 1: Birincil anahtar içermeyen ana tablo
İki söz dizimi varyantı eşdeğerdir. Hologres sürümünüz destekliyorsa V2.1+ söz dizimini kullanın.
Hologres V2.1 ve sonraki sürümler:
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;
Tüm Hologres sürümleri:
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;
Örnek 2: Birincil anahtar içeren ana tablo
Birincil anahtar tanımlandığında, bölüm anahtarı sütununun (bu örnekte ds) birincil anahtarın bir parçası olması gerekir.
Hologres V2.1 ve sonraki sürümler:
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;
Tüm Hologres sürümleri:
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;
Alt tabloları listeleme
HoloWeb'i veya aşağıdaki SQL deyimini kullanarak bir ana tablonun tüm alt tablolarını listeleyin. parent_table_name ifadesini gerçek ana tablo adıyla değiştirin.
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';
Özellik devralma kuralları
CREATE TABLE ... PARTITION OF kullanarak bir alt tablo oluşturduğunuzda, alt tablo ana tablodan çoğu özelliği devralır. Aşağıdaki tabloda hangi özelliklerin eşleşmesi gerektiği ve hangilerinin farklı olabileceği gösterilmektedir.
Eşleşmelidir: Bu özellikler için farklı bir değerle alt tablo eklemek hata döndürür. Bundan kaçınmak için, ana tablonun özellik ayarlarını kopyalayan CREATE TABLE LIKE kullanarak alt tablolar oluşturun.
Farklı olabilir: Alt tabloda açıkça ayarlanmadıysa, alt tablo ana tablonun değerini devralır. Açıkça ayarlanırsa, alt tablonun değeri geçerli olur.
Ana tablonun dizinlenmiş sütunlarını içermelidir: Alt tablonun dizinlenmiş sütunları, ana tablonunkilerin üst kümesi olmalıdır. Alt tabloya ek dizinlenmiş sütunlar eklenebilir.
| Kategori | Özellik | Ana tablodan devralınır | Ekleme sırasındaki kural |
|---|---|---|---|
| Tablo özelliği | orientation |
Evet | Eşleşmelidir |
| Tablo özelliği | table_group |
Evet | Eşleşmelidir |
| Tablo özelliği | time_to_live_in_seconds |
Evet | Farklı olabilir |
| Dizin | Birincil anahtar | Evet | Eşleşmelidir |
| Dizin | distribution_key |
Evet | Eşleşmelidir |
| Dizin | clustering_key |
Evet | Eşleşmelidir |
| Dizin | event_time_column |
Evet | Eşleşmelidir |
| Dizin | bitmap_columns |
Evet | Farklı olabilir |
| Dizin | dictionary_encoding_columns |
Evet | Farklı olabilir |
| Dizin | binlog_level |
Evet | Eşleşmelidir |
| Dizin | proxima_vectors |
Evet | Eşleşmelidir |
| Sütun kısıtlaması | nullable (NOT NULL) |
Evet | Eşleşmelidir |
| Sütun kısıtlaması | Varsayılan değer | Evet | Eşleşmelidir |
Sonraki adımlar
Dynamic partitioning — yapılandırılan kurallara göre alt tabloları otomatik olarak oluşturur ve yönetir, her bölümü önceden manuel olarak oluşturmanıza gerek kalmaz.
ALTER PARTITION TABLE — oluşturulduktan sonra bölümleri değiştirin.
DROP PARTITION TABLE — bölümlenmiş tabloları silin.