PostgreSQL'deki herhangi bir satırın ek yükünün 23 bytes (HeapTupleHeaderData) olduğu göz önünde bulundurulduğunda, gerçekten çok az miktarda alanla ilgileniyorsanız, verilerinizi saklamak için yanlış yolu seçtiniz.
Daha karmaşık olan tüm türler kendi başlarına sahip olduklarından bağımsız olarak (bytea örneğin 4 baytlık 5 baytlık bir ek yük ekler), aradığınız şeyi başarmanın tek yolu bir bigint kullanmaktır (8 bayt), her bir değerin sayısal olarak kaydırılması ve sonuçların bir araya getirilmesi. Kodu daha kolay hale getirmek için bit string operations'u kullanarak yapabilirsiniz - bit dizgisi olarak hesaplayın, daha sonra depolamadan önce bigint'e dökün - ya da hızın daha iyi olmasını istiyorsanız sadece elle çarpın/ekleyin.
int2 = 256 * byte1 + byte2
byte1 = int2/256
byte2 = int2 % 256
Bunlardan 7 bu şekilde depolanması halinde aynı fikri uzatabilirsiniz: Bir iki bayt yapıya birlikte iki bayt depolamak ve daha sonra onları tekrar geri almak nasıl Örneğin, burada. Geri alma ek yükü hala korkunç olacak, ancak aslında süreçte biraz yer kaplayacaksınız. Ancak sadece satır başlığına göre değil.
her satırda 6 x 1 bayt tamsayı (?), 3 x 2 bayt tamsayı (SMALLINT) ve 2 x 4 bayt tamsayı (INT) vardır. Bu, satır başına toplam 20 bayt artı Pg'nin genel yüküdür. Pg sadece SMALLINT'leri en küçük değer olarak sağladığından, 6 1 bayt değerlerim 12 bayt alır. Bunlar için olası bir alternatif arıyorum. 120 milyar satırlık 6 baytlık bir tasarruf 670 GB civarındadır (eğer hesaplamam doğruysa). Yani, bu değerleri ayrı ayrı almam gerekiyor, bu yüzden fiyatı geri alma hızında ödeyebilirim. İkisini dengelemeye ihtiyacım var. 0,7 TB, daha büyük şemalarda çok büyük bir alan değildir. – punkish