Bölümlenmiş tablo, verileri bir veya daha fazla sütuna göre ayrı fiziksel konumlarda depolar. Bir bölümlenmiş tabloyu sorguladığınızda MaxCompute, tüm tabloyu taramak yerine yalnızca eşleşen bölümleri tarar; bu durum hesaplama maliyetlerini azaltır ve büyük ölçekli veri yönetimini daha esnek hale getirir.
Bölümleme seçenekleri
MaxCompute iki bölümleme yaklaşımı sunar:
|
|
|
|
|
|
|
|
|
|
|
|
Otomatik bölümlenmiş tablolar iki yöntemi destekler:
|
|
|
|
|
|
|
|
Bölümlenmiş tablolar ne zaman kullanılmalı
Bölümlenmiş tablolar aşağıdaki durumlarda uygun bir seçimdir:
Tablonuz büyük ve sorgular yavaş çalışıyor: Bölüm filtreleri, MaxCompute'ün eşleşmeyen bölümleri tamamen atlamasını sağlayarak tam tablo taramalarını ortadan kaldırır.
Sorgu desenleri belirli zaman aralıklarına veya kategorilere yoğunlaşıyor: Bölüm filtreniz ne kadar seçici olursa performans kazancı o kadar yüksek olur.
Tek tek satırlardan daha kaba granülerlikte veri yazmanız veya silmeniz gerekiyor: Bölümlenmiş tablolarla belirli bir bölümü doğrudan hedefleyebilirsiniz; örneğin, satır düzeyinde silme işlemleri yapmak yerine geçen ayın verilerini saniyeler içinde silebilirsiniz.
Verilerin otomatik olarak süresinin dolmasını istiyorsunuz: Yaşam döngüsü ilkeleri bölüm düzeyinde çalıştığından temizleme işlemi için manuel müdahale gerekmez.
Bölüm boyutu yönergeleri
Bölüm granülerliği, sorgu performansını ve sistem yükünü doğrudan etkiler:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sınırlamalar
Bir tabloda en fazla 6 bölüm düzeyi bulunabilir.
Bir tabloda en fazla 60.000 bölüm bulunabilir.
Tek bir sorgu en fazla 10.000 bölümü tarayabilir.
STRING bölüm anahtarı değerleri Çince karakter içeremez.
Bölüm sütunlarının veri türleri
MaxCompute V2.0, STRING, TINYINT, SMALLINT, INT, BIGINT ve VARCHAR veri türlerini bölüm sütunu türü olarak destekler. MaxCompute tüm bölüm değerlerini dahili olarak STRING olarak saklar ve diğer türleri otomatik olarak dönüştürür. Türle ilgili hatalardan kaçınmak için bölüm sütunlarını STRING olarak tanımlayın.
MaxCompute 1.0 veri türü sürümü, bölüm sütunları için yalnızca STRING türünü destekler. Bir bölüm sütununu BIGINT olarak tanımlamak, türün tablo şemasında nasıl göründüğünü yalnızca gösterim açısından etkiler; tüm hesaplamalarda ve karşılaştırmalarda MaxCompute sütunu STRING olarak ele alır.
Bu ayrım bölüm budama işlemi için önemlidir. WHERE yan tümcesi bir STRING bölüm anahtarını tırnak işaretleri olmadan bir BIGINT değeriyle karşılaştırdığında MaxCompute her iki tarafı da örtülü olarak DOUBLE türüne dönüştürür. Örtülü dönüştürme hassasiyet kaybına neden olabilir ve bölüm budamayı bozarak bölüm koşulu belirtmiş olsanız bile tam tablo taramasına zorlayabilir. Aşağıdaki örnek bu davranışı göstermektedir:
-- Create a partitioned table with a BIGINT partition column (MaxCompute 1.0 data type version)
CREATE TABLE parttest (a BIGINT) PARTITIONED BY (pt BIGINT);
-- Insert data
INSERT INTO parttest PARTITION(pt)(a, pt) VALUES (1, 1);
INSERT INTO parttest PARTITION(pt)(a, pt) VALUES (1, 10);
-- Query the rows where the value of pt is greater than or equal to 2.
-- The returned result is empty.
SELECT * FROM parttest WHERE pt >= '2';
Zaman ve tarih türleri (DATE, DATETIME, TIMESTAMP) bölüm sütunu türü olarak desteklenmez. Zamana göre bölümlemek için TRUNC_TIME işleviyle birlikte otomatik bölümlenmiş bir tablo kullanın.
Standart bölümlenmiş tablo örnekleri
Aşağıdaki örneklerde iki düzeyli bölümlenmiş bir tablo kullanılmaktadır: birinci düzey pt (tarih), ikinci düzey ise region şeklindedir.
Adım 1: Bölümlenmiş tabloyu oluşturun.
-- Two-level partitioned table: first level by date (pt), second level by region
CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING, region STRING);
Adım 2: Bölümleri ekleyin ve veri girin.
ALTER TABLE src ADD PARTITION (pt='20170506', region='hangzhou') PARTITION (pt='20180101', region='shanghai');
INSERT INTO src PARTITION (pt='20170506', region='hangzhou') VALUES ('s1', 1), ('s2', 2), ('s3', 3);
INSERT INTO src PARTITION (pt='20180101', region='shanghai') VALUES ('c1', 4), ('c2', 5), ('c3', 6);
Adım 3: Bölüm filtrelerini kullanarak sorgulama yapın.
Bölüm anahtarı değerleri için dize değişmez değerleri kullanın. MaxCompute, eşleşen bölümleri doğrudan meta verileri kullanarak bulur ve eşleşmeyen tüm verileri atlar.
-- Correct: string literals trigger partition pruning
SELECT * FROM src WHERE pt='20170506' AND region='hangzhou';
Çıktı:
+------------+-------------+------------+------------+
| shop_name | customer_id | pt | region |
+------------+-------------+------------+------------+
| s1 | 1 | 20170506 | hangzhou |
| s2 | 2 | 20170506 | hangzhou |
| s3 | 3 | 20170506 | hangzhou |
+------------+-------------+------------+------------+
STRING bölüm anahtarını sayısal bir değişmez değerle karşılaştırmaktan kaçının. MaxCompute her iki tarafı da örtülü olarak DOUBLE türüne dönüştürür; bu durum hassasiyet kaybına neden olabilir ve bölüm budamayı tamamen atlayabilir:
-- Incorrect: numeric literals cause an implicit cast to DOUBLE, breaking partition pruning
SELECT * FROM src WHERE pt = 20170506 AND region = hangzhou;