Bir PostgreSQL tablosu için ne kadar büyüktür?


127

Şirketim için bir RoR projesinin tasarımı üzerinde çalışıyorum ve geliştirme ekibimiz tasarımla, özellikle de veritabanıyla ilgili bir miktar tartışmaya girdi.

MessageKalıcı olması gereken bir modelimiz var . Bu, id dışında yalnızca üç db sütunu olan çok, çok küçük bir model, ancak üretime gittiğimizde muhtemelen bu modellerin BİRÇOKU olacak. Günde 1.000.000 kadar eklemeye bakıyoruz. Modeller yalnızca üzerlerinde indekslenebilen iki yabancı anahtarla aranacaktır. Ayrıca modellerin asla silinmesi gerekmiyor, ancak yaklaşık üç aylık olduklarında onları saklamamız da gerekmiyor.

Öyleyse merak ettiğimiz şey, bu tabloyu Postgres'te uygulamanın önemli bir performans sorunu oluşturup oluşturmayacağı? Bunun bir sorun olup olmayacağını bize söyleyen çok büyük SQL veritabanları konusunda deneyimi olan var mı? Ve eğer öyleyse, hangi alternatifle gitmeliyiz?


4
iyi bir önbelleğe alma katmanı ve PG'de küçük bir yapılandırma ile iyi olmalısınız. Performans sorunlarını duruma göre ele almalı ve önceden optimize etmekten kaçınmalısınız. Bununla birlikte, bölümleme ve çoğaltma, darboğazları bir kez tıkladığınızda yararlanabileceğiniz harika seçeneklerdir.
Sam

1
İlgili soru burada ve burada .
Erwin Brandstetter

5
Bir 5 TB PostgreSQL veritabanında günde yaklaşık 30 milyon ileti işliyoruz, sorunsuz çalışıyor.
Frank Heikens


1
Bilginize, bugün postgresql.org/about'u okudum ve bir tablodaki satır sayısının (prensipte) sınırsız olduğunu söylediğini fark ettim.
Al Chou

Yanıtlar:


115

Tablo başına satırlar kendi başına bir sorun olmayacaktır.

Yani kabaca 90 gün boyunca günde 1 milyon satır 90 milyon satırdır. Postgres'in ne yaptığınızın tüm ayrıntılarını bilmeden bununla başa çıkamayacağı bir neden göremiyorum.

Veri dağıtımınıza bağlı olarak, hangi performans sorunlarına sahip olabileceğinizi veya olmayabileceğinizi gördükten sonra işleri hızlandırmak için bir dizi dizin, filtrelenmiş dizin ve bir tür tablo bölümleme karışımı kullanabilirsiniz. Sorununuz, bildiğim diğer tüm RDMS'lerde aynı olacaktır. Verileri budamak için yalnızca 3 aylık veri tasarımına ihtiyacınız varsa, artık ihtiyacınız yoktur. Bu şekilde, tabloda tutarlı bir veri hacmine sahip olursunuz. Ne kadar verinin olacağını bildiğiniz için şanslısınız, hacminiz için test edin ve ne elde ettiğinizi görün. 90 milyon satırlık bir tabloyu test etmek şu kadar kolay olabilir:

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/FAQ

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited

19
90 milyon satırın PostgreSQL için sorun olmayacağına katılıyorum. Ancak PostgreSQL ile bir ORM için sorun olabilir . (Aslında herhangi bir dbms içeren bir ORM.)
Mike Sherrill 'Cat Recall'

@ MikeSherrill'Catcall 'İyi nokta, sadece "Bir PostgreSQL tablosu için ne kadar büyük?"
Kuberchaun

2
@yeyo: ORMS'nin genellikle veri almak için çok fazla sorgu kullandığından olabilir sadece bir ya da iki ile iade edilir. OP Ruby on Rails kullanıyor.
Mike Sherrill'in 'Cat Recall'

39
Bu biraz geç ama bence çoğu durumda (özellikle raylar / aktif kayıt ile) ORM'yi denklemden tamamen çıkarmanın ve performans nedenleriyle sorgulamak için ham bir sql dizesi yazmanın yaygın olduğunu düşünüyorum. ORM'nizin sizin için veri kararları vermesine izin vermeyin! Bu bir aksesuar gerekli değil.
Stefan Theard

2
URL'de belirtilen yaklaşık URL şu anda bu sınırları göstermiyor - kimse nereye taşındığını biliyor mu?
Kırpılmış

59

100 milyondan fazla satır içeren bir tabloda sorgularınızı önemli ölçüde hızlandırmanın bir başka yolu da mesai saatleri dışında, sorgularınızda en sık kullanılan tabloyu dizinde kümelemektir. 218 milyondan fazla satır içeren bir tablomuz var ve 30X iyileştirme bulduk.

Ayrıca, çok büyük bir tablo için, yabancı anahtarlarınızda bir dizin oluşturmak iyi bir fikirdir.


> mesai saatleri dışında sorgularınızda en sık kullanılan tabloyu indekste birleştirin .... bunun nasıl yapıldığını açıklayabilir misiniz?
casus

6
Evet, işte adım adım bir ÖRNEK: 1) Bahsettiğim tabloya bu örnekte yatırım deniyor. 2) Sorgularda en çok kullanılan indeks (bankid, kayıt_tarihi) Yani işte adım adım: 1) psql -c "drop index invest_bankid_rec_dt_idx;" dbname 2) psql -c "yatırımda yatırım_bankid_rec_dt_idx endeksi oluştur (banka kimliği, kayıt_tarihi);" 3) psql -c "yatırım üzerine küme yatırım_bankid_rec_dt_idx;" 4) vakumdb -d ccbank -z -v -t yatırımı Yani birinci ve ikinci adımda endeksi bırakıp yeniden oluşturuyoruz.
James Doherty

3
3. Adım kümeyi oluşturuyoruz, bu temelde DB tablosunu dizinin fiziksel sırasına yerleştiriyor, böylece postgresql bir sorgu gerçekleştirdiğinde en olası sonraki satırları önbelleğe alıyor. Adım 4 sorgu planlayıcısının istatistiklerini sıfırlamak için veritabanını
James Doherty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.