Yanıtlar:
Buradaki anahtar kelimeler:
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. VACUUM
artık herhangi bir açık işlem tarafından görülemeyen ölü satırları tanımlar. Kullanım kılavuzu:
Standart form,
VACUUM
tablo 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_threshold
ve 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 fillfactor
de 50 gibi bir şeye indiririm. Test etmeli ve tatlı noktayı bulmalısınız.
Tüm bunlar bir yana, verileriniz başlamak için geçici gibi göründüğü için bir UNLOGGED
tablo 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 .
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.