Önbellek tablosu için hangi dolgu faktörü?


10

Serileştirilmiş java nesneleri depoladığım ağır güncellenen / erişilen tablo var. Tabloda 2-3 saattir (o dönemde güncellenir) ve daha sonra kaldırılır. Tablonun boyutu yaklaşık 300MB. Ben çok, çok sık VAKUM olduğunu fark ettim ve değiştirmek fillfactoryardımcı olur merak ?

Yanıtlar:


17

Buradaki anahtar kelimeler:

  1. "yoğun bir şekilde güncellendi"
  2. msgstr "tabloda 2-3 saat".

1. nokta daha düşük bir doldurma faktörünün göstergesidir, 2. ise tam tersidir. Aynı veri sayfasında birden çok satır sürümü depolanmışsa performansa yardımcı olur. SICAK güncellemeler bunu başaracaktı. Burada veya burada okuyun . Veri sayfasında, ölü tuples veya fillfactor<100 tarafından ayrılmış bir alan gibi biraz kıpır kıpır odaya ihtiyaçları vardır. Ancak, hiçbir dizin, durumunuz için doğru olması gereken güncellenmiş sütunlardan herhangi birini içermiyorsa , yalnızca kendi şeylerini yapabilir .

Buradaki bir başka önemli faktör, demet boyutu (sayfa boyutunuzla karşılaştırıldığında (en yaygın olarak 8 kb'dir) olacaktır.

Grup boyutu 4 kb veya daha fazlaysa, veri sayfasında hiçbir zaman birden fazla grup bulunamayacağından, doldurma faktörünü azaltmak boş olur. Siz de bırakabilirsiniz 100(yine de varsayılan değerdir). Bununla birlikte, bazı veri türleri bir boyut sınırını aşarsa "kızartılır" ve hat dışında saklanır, bu nedenle ana ilişki çatalında çok fazla şey gerektiren tüpler nadirdir.

Ne yaparsanız yapın, VACUUM olur genellikle çalıştırılabilir. Ve bu genellikle iyi bir şey, bunun için endişelenmezdim. Çok sayıda ölü tuple yaratıyorsunuz. VACUUMartık herhangi bir açık işlem tarafından görülemeyen ölü satırları tanımlar. Kullanım kılavuzu:

Standart form, VACUUMtablo ve dizinlerdeki ölü satır sürümlerini kaldırır ve ileride yeniden kullanılmak üzere kullanılabilir alanı işaretler .

Cesur vurgu benim. Otovakumun sadece bu tablo için daha az (veya daha fazla) tetiklemesi için tablo başına ayarlarla
oynayabilirsiniz :

Varsayılan eşikler ve ölçek faktörleri alınır postgresql.conf, ancak bunları tablo bazında geçersiz kılmak mümkündür ;

Cesur vurgu benim. Özellikle autovacuum_vacuum_thresholdve ileautovacuum_vacuum_scale_factor . Çok koşmak VACUUM, çok düşük olmak yerine iyi bir fikir olabilir fillfacter. Bu erişim kalıplarına bağlıdır. Eğer tüm tuples diyelim, 3 saat ve her biri birkaç kez güncellenirse, yine fillfactorde 50 gibi bir şeye indiririm. Test etmeli ve tatlı noktayı bulmalısınız.

Alternatifler

Tüm bunlar bir yana, verileriniz başlamak için geçici gibi göründüğü için bir UNLOGGEDtablo kullanın :

Bloke edilmemiş tablolara yazılan veriler, önden yazma günlüğüne yazılmaz (bkz. Bölüm 29 ), bu da onları sıradan tablolardan çok daha hızlı yapar . Ancak, bunlar kilitlenmeye karşı korumalı değildir: kilitlenmemiş bir tablo, bir kilitlenme veya temiz olmayan kapatma işleminden sonra otomatik olarak kesilir. Engellenmeyen bir tablonun içeriği de bekleme sunucularına çoğaltılmaz.

Cesur vurgu benim. Sunucunuz çökebilirse ve yine de verilere ihtiyacınız varsa bunu kullanmayın. Ancak web uygulamaları için oturum verileri hakkında konuşuyorsak, bu ödeme için kabul edilebilir bir fiyat olabilir.

Ya da daha radikal: RDBMS tarafından sağlanan özellikler ve güvenlik olmadan yapabiliyorsanız, Redis gibi bir anahtar / değer deposu kullanın .


Bence UNLOGGED tam ihtiyacım olan şey
Michal

0

Ben bir anahtar / değer DBMS öneriyoruz, ama ben ilgi uğruna bunu dışarı atmak.

INSERT & DELETE deyimlerini gerçekleştirmek yerine, yalnızca UPDATE'ler yapın.

Masa yapısı şöyle olacak

ID      integer  -- sequential ID
Used    boolean  -- default FALSE
Object  -- whatever type is appropriate

Bölmeleri ve satır hareketlerini önlemek için nesne tutma sütunu sabit uzunlukta olacaktır. Nesnelerinizi yerleştirmek ve diskteki bir sayfayı etkili bir şekilde doldurmak için bu sütunu boyutlandırın.

Tablonuzu ihtiyacınız olan sayıda satır ve birkaç satırla önceden doldurun.

Bir nesne yazılacaksa Used = False ile bir satır bulun ve bu satırı GÜNCELLEŞTİRİN. Bir nesne imha edilecekse, onu "Yanlış" olarak ayarlayın. Hiçbir çöp ve dolayısıyla çöp toplama yoktur.

Tabii ki, ele alınacak birçok istisna koşulu vardır (sıra taşması, masa taşması, kimlik kullanımında yarış koşulları vb.), Ancak hiçbiri aşılmaz değildir.


Anladığım kadarıyla, bu GÜNCELLEMELER, SICAK bir güncelleme olmadıkça genellikle satırın tamamen yeni bir kopyasını diske yazar. Böylece hala zamanla GC / Vakumlamaya ihtiyaç duyuyorsunuz.
Jeff Widman
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.