Dado que la sobrecarga de cualquier fila en PostgreSQL es 23 bytes (HeapTupleHeaderData), si realmente le interesan las pequeñas cantidades de espacio esto probablemente haya elegido la forma incorrecta de almacenar sus datos.
Independientemente de que todos los tipos más complicados tengan sus propios gastos generales (bytea agrega cuatro bytes de sobrecarga, por ejemplo, cadenas de bits 5 a 8), la única manera de lograr lo que estás buscando es usar un bigint (8 bytes), desplazando numéricamente cada valor y OR-ing juntos el resultado. Puede hacer esto usando el bit string operations para hacer que el código sea más fácil: calcule como una cadena de bits, luego conviértalo en letra grande antes de almacenarlo, o simplemente multiplique/agregue manualmente si desea que la velocidad sea mejor. Por ejemplo, aquí es cómo es posible almacenar dos bytes juntos en una estructura de dos bytes y luego recuperarlas:
int2 = 256 * byte1 + byte2
byte1 = int2/256
byte2 = int2 % 256
se puede extender la misma idea en el almacenamiento de 7 de ellos de esa manera. La sobrecarga de recuperación aún será terrible, pero habrá ahorrado espacio en el proceso. Pero no mucho en relación con solo el encabezado de la fila.
cada fila tiene enteros de 6 x 1 byte (?), Enteros de 3 x 2 bytes (SMALLINT) y enteros de 2 x 4 bytes (INT). Eso es un total de 20 bytes por fila, más la sobrecarga de Pg. Como Pg solo proporciona SMALLINT como el valor más pequeño, mis valores de 6 1 byte tomarán 12 bytes. Estoy buscando una posible alternativa para estos. Un ahorro de 6 bytes por 120 mil millones de filas es de aproximadamente 670 GB (si mi cálculo es correcto). Dicho esto, necesito sacar estos valores individualmente, por lo que podría pagar el precio en velocidad de recuperación. Necesito equilibrar los dos. 0.7 TB no es una gran cantidad de espacio en el esquema más grande de las cosas. – punkish