Pregunta

Tengo 2 tablas con el siguiente esquemas con el mismo número de filas. Cuando ejecuto el comando SELECT relname, relpages FROM pg_class ORDER BY relpages DESC, que aparecen como 23 GB cada uno a pesar de que los tipos de datos (número total de bytes) para Thew dos esquemas resultan en diferentes tamaños. ¿Cuál es la mejor manera de calcular la cantidad de espacio que ahorraría mediante la combinación de las tablas? Además, ¿hay alguna manera de determinar, cuánto espacio cada fila es en realidad tomando?

                                 Table "public.table1"
Column        |           Type           |                      Modifiers                      
--------------+--------------------------+-----------------------------------------------------

 field1       | smallint                 | 
 field2       | smallint                 | 
 field3       | integer                  | 
 field4       | smallint                 | 
 timestamp    | timestamp with time zone | 
 user_id      | integer                  | 
 status       | boolean                  | 
 id           | integer                  | not null default 

                                  Table "public.table2"
 Column          |           Type           |                     Modifiers                      
 ----------------+--------------------------+----------------------------------------------------
 user_id         | integer                  | 
 begin_timestamp | timestamp with time zone | 
 end_timestamp   | timestamp with time zone | 
 field           | smallint                 | not null
 id              | integer                  | not null default 
¿Fue útil?

Solución

Una respuesta razonable a esta necesidad en mi humilde opinión pregunte (o por lo menos implica) la pregunta: ¿Por qué se separaron las tablas para empezar? (Que es más importante: ¿Se aplica todavía?)

El caso general: No sé los detalles de cómo los postgres db funciona el motor, pero el límite inferior del espacio de disco guardada puede ser mayor que el tamaño de las columnas eliminado + índices de variables duplicadas + Un bit de datos de limpieza

El límite superior es también muy pequeña, por lo que es probable que no va a valer la pena; incluso puede ser que se repartieron por razones de rendimiento - porque se puede acceder a algunas columnas (leer, o incluso actualizan) más a menudo, y como tal, se podrían hacer pequeños (menos columnas) para hacerlo más rápido. (En algún pena para acceder a columnas de ambos al mismo tiempo.)

El caso específico: Parece que hay una gran cantidad de campos redundantes entre ellos. user_id, por ejemplo, no tendría que estar allí dos veces. comienzan / / X marcas de tiempo final quizá podrían reducirse a dos o uno. Por lo que podría haber una ligera ahorro de eso, dependiendo de los requerimientos de la aplicación. Una vez más, tratar de averiguar por qué lo hicieron, para empezar.

En general, sin embargo, estoy de acuerdo con Bryan Agee; espacio de disco probablemente no debería ser su preocupación en nada lo suficientemente grande para funcionar postgres, para empezar. Sobre todo si se les paga por el tiempo que pasa en "arreglar" esto, es probable que supere el coste de la disco más grande por sí mismo ese costo.

espacio por fila: No estoy muy versado en Postgres datos, por lo que alguien en el saber debe ser capaz de cualquier cosa mal correcta. Tal como hay manera de pedir ser postgres la cantidad de espacio que la fila en cuestión se encuentra ocupando; No conozco ninguno. Lo que estoy escribiendo es básicamente la teoría detrás de almacenamiento de base de datos como (creo) comúnmente se hace en la actualidad.

Cada campo tiene un poco (en un byte de su propia, o en un común bitset para toda la fila), que dice que si el valor es un valor nulo o no. Si se trata de un valor nulo, no hay nada más almacenado. Luego hay un byte de longitud - a menos que esto está implícita de los tipos de datos de ancho fijo. Luego están los propios datos.

Por lo tanto, una fila de uno int (incluso de 64 bits) y tres valores nulos puede tardar tan poco como 3 bytes. (Para valores <127, el almacenamiento size = 1 y el byte.) Más índices y servicio de limpieza de varios otros metadatos . Una vez más, no sé hasta qué punto postgres va en este sentido. Y todos estos factores en su conjunto tienden a hacer "¿cuánto ocupa esta fila" a una pregunta con una respuesta inútil.

postgres yo sepa también opera con "páginas" - bloques de espacio que una fila no puede ser almacenado a través de las fronteras de. Por lo tanto, los registros más grandes pueden a menudo terminan "no cabe" en una página y así necesidad de ser colocado en otro / nueva página.

Otros consejos

Debido a la tabla combinada resultante tendría filas no utilizadas para los registros de cada tabla respectiva, lo más probable es que usted no ganar espacio, pero perderlo.

Más importante que eso, sería altamente desalentar a tomar una decisión de la arquitectura de esa naturaleza por razones de espacio en disco. Los discos son baratos - una aplicación bien diseñada y funcional no es. Si hay un problema de rendimiento en tiempo de ejecución (es decir, los 46 GB está siendo cargado en el espacio de memoria / swap) a continuación, es posible que tenga un problema de optimización y puesta a punto en sus manos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top