2015-07-22 26 views
6

Postgres dokümantasyon tablo bölümleri koşullar Üst üste binen kısıtlamalarla postgre tablo bölümleme kullanmak güvenli midir?

kısıtlamalar farklı bölümlere izin anahtar değerleri arasında örtüşme olmayacak olduğunu garanti emin olun örtüşmeyen gerektiğini söylüyor.

ama anlamıyorum neden, veri hala tetikte karar verir sokulacak olması kesin bölüm hangi örtüşen kısıtlamaları

farkında olabilir çünkü şu durum, bir masa ile yapmış bir sürü metin bilgisi ve update_date zaman damgası, bu tablo çeyreğe bölünmüş ve tüm yeni veya güncellenmiş satırlar en yeni bölüme giriyor, problemi gin trigram indeksi çok yavaş, bu yüzden trigram indeksi oluşturmaktan kaçınmak istiyorum şu anda geçerli ana öğe oluşturmak için sorumlu olan

dinamik olarak, şimdiki gün için çeyrek bölümle çakışacak yeni bölüm eklemeyi planlıyorum ve geçerli günlük bölüm için trigram indeksini devre dışı bırakmak istiyorum (veriyi tekrar çeyrek bölüme birleştirmek başka bir bakım görevi olurdu)

Çakışan update_date kısıtlamaları ile el ile bölüm tabloları oluşturmayı denedim ve postgre'ler şikayet etmedim, hatta arama yaptım ve her iki tablo da planlarda kullanıldı, bu yüzden iyi çalışıyor gibi görünüyor, ancak belgeler kısıtlamaların olabileceğini söylüyor ' t çakışıyor, neden bu?

Uygun tetikleyiciler ve bakım varsa, çakışan kısıtlamalarla bölümler oluşturmak güvenli midir?

UPD:

CREATE TABLE master (text_value text, update_date timestamp); 

CREATE TABLE partition_year (
    CHECK (update_date >= DATE '2015-01-01' AND update_date < DATE '2015-12-31') 
) INHERITS (master); 

CREATE TABLE partition_month (
    CHECK (update_date >= DATE '2015-07-01' AND update_date < DATE '2015-8-01') 
) INHERITS (master); 

-- in production this would be handled by trigger 
insert into partition_year(text_value, update_date) values ('year', '2015-01-02'); 
insert into partition_month(text_value, update_date) values ('month', '2015-07-02'); 

-- this scans only year partition 
explain select * from master where update_date = '2015-01-02'; 

-- this scans both year and month partition 
explain select * from master where update_date = '2015-07-02'; 

bu örnek postgres hem yıl ve ay Bölme okur ve ben bunu yapabilir varsayalım onların örtüşme

+1

Çok ilginç bir soru. Emin değilim. Kısıtlama hariç tutma, birden fazla tablonun kısıtlamayı karşıladığı birden fazla tabloyu seçmek için çalışır, bu yüzden bu kısıtlamanın neden uygulanmasının gerektiği konusunda pek emin değilim. Bununla birlikte, PostgreSQL'in bir örtüşme olduğu tüm bölümleri taramayı seçeceğini unutmayın. –

cevap

0

hakkında çok fazla umursamayan göstermektedir. Belgeleme, bölümleme kavramını özel bir tablo devralması durumu olarak açıklar. Uygulamanızda farklı uygulamalar olabilir. Örneğin, bölümler oluşturabilir ve db'de tetikleyicileri kullanmadan kodunuzdan eklemek için hangisinin kullanılacağına karar verebilirsiniz. Böyle durumlarda db'deki bu kontroller bir güvenlik önlemidir.

İlgili konular