Buen día amigos, gusto en saludarles. Esto me tiene de cabeza. Tengo una tabla transaccional para almacenar información de saldos de créditos. Día tras día se almacena nueva información de todos los créditos de los clientes. Existe una columna FECHA_SNAPSHOT que agrupa la información en cada día. La definición de la tabla es la siguiente:
*fecha_snapshot* | date | not null | plain | | *rc_credito_numero_credito* | character varying(25) | not null | extended | | *rc_credito_tc_cliente_codigo* | character varying(20) | not null | extended | | *rc_credito_tc_agencia_codigo* | character varying(10) | not null | extended | | saldo_capital | numeric(20,2) | not null | main | | saldo_capital_vigente | numeric(20,2) | not null | main | | saldo_capital_reestructurado | numeric(20,2) | not null | main | | saldo_capital_vencido | numeric(20,2) | not null | main | | saldo_capital_litigio | numeric(20,2) | not null | main | | tasa_interes | numeric(7,4) | not null | main | | cuotas_vencidas | integer | not null default 0 | plain | | dias_mora | integer | not null default 0 | plain | | intereses_vigentes | numeric(20,2) | not null default 0 | main | | intereses_mora_vigentes | numeric(20,2) | not null default 0 | main | | intereses_reestructurados | numeric(20,2) | not null default 0 | main | | intereses_vencidos | numeric(20,2) | not null default 0 | main | | intereses_cobrados | numeric(20,2) | not null default 0 | main | | porcentaje_provision_especifica | numeric(7,4) | not null default 0 | main | | porcentaje_provision_generica | numeric(7,4) | not null default 0 | main | | porcentaje_provision_rendimiento | numeric(7,4) | not null default 0 | main | | monto_provision_especifica | numeric(20,2) | not null default 0 | main | | monto_provision_generica | numeric(20,2) | not null | main | | monto_provision_rendimiento | numeric(20,2) | not null | main | | consecutivo | integer | | plain | | tc_cuenta_contable_codigo | character varying(20) | not null | extended | | rc_calificacion_codigo_riesgo_credito | character varying(10) | not null | extended | | rc_calificacion_codigo_riesgo_cliente | character varying(10) | not null | extended | | rc_calificacion_codigo_riesgo_sicri | character varying(10) | not null | extended | | rc_situacion_contable_codigo | character varying(10) | not null | extended | | rc_estado_pago_codigo | character varying(10) | not null | extended | | rc_producto_crediticio_codigo | character varying(10) | not null | extended | | fecha_reprecio | date | | plain | | created_at | timestamp with time zone | default now() | plain | | updated_at | timestamp with time zone | default now() | plain | | Indexes: "rc_carteras_creditos_pkey" PRIMARY KEY, btree (fecha_snapshot, rc_credito_numero_credito, rc_credito_tc_cliente_codigo, rc_credito_tc_agencia_codigo) "idx_rc_carteras_creditos_rc_calificaciones1" btree (rc_calificacion_codigo_riesgo_credito) "idx_rc_carteras_creditos_rc_calificaciones2" btree (rc_calificacion_codigo_riesgo_cliente) "idx_rc_carteras_creditos_rc_calificaciones3" btree (rc_calificacion_codigo_riesgo_sicri) "idx_rc_carteras_creditos_rc_creditos1" btree (rc_credito_numero_credito, rc_credito_tc_cliente_codigo, rc_credito_tc_agencia_codigo) "idx_rc_carteras_creditos_rc_estados_pagos1" btree (rc_estado_pago_codigo) "idx_rc_carteras_creditos_rc_productos_crediticios1" btree (rc_producto_crediticio_codigo) "idx_rc_carteras_creditos_rc_situaciones_contables1" btree (rc_situacion_contable_codigo) "idx_rc_carteras_creditos_tc_cuentas_contables1" btree (tc_cuenta_contable_codigo) Foreign-key constraints: "fk_rc_carteras_creditos_rc_calificaciones1" FOREIGN KEY (rc_calificacion_codigo_riesgo_credito) REFERENCES rc_calificaciones(codigo) "fk_rc_carteras_creditos_rc_calificaciones2" FOREIGN KEY (rc_calificacion_codigo_riesgo_cliente) REFERENCES rc_calificaciones(codigo) "fk_rc_carteras_creditos_rc_calificaciones3" FOREIGN KEY (rc_calificacion_codigo_riesgo_sicri) REFERENCES rc_calificaciones(codigo) "fk_rc_carteras_creditos_rc_creditos1" FOREIGN KEY (rc_credito_numero_credito, rc_credito_tc_cliente_codigo, rc_credito_tc_agencia_codigo) REFERENCES rc_creditos(numero_credito, tc_cliente_codigo, tc_agencia_codigo) "fk_rc_carteras_creditos_rc_estados_pagos1" FOREIGN KEY (rc_estado_pago_codigo) REFERENCES rc_estados_pagos(codigo) "fk_rc_carteras_creditos_rc_productos_crediticios1" FOREIGN KEY (rc_producto_crediticio_codigo) REFERENCES rc_productos_crediticios(codigo) "fk_rc_carteras_creditos_rc_situaciones_contables1" FOREIGN KEY (rc_situacion_contable_codigo) REFERENCES rc_situaciones_contables(codigo) El cliente me pide el cálculo de volumetría para de la tabla a fin de proyectar espacio en disco ocupado a futuro y solicitar el storage requerido. Se sabe a priori cuantos registros por día en promedio habrán (basado en historia). A partir de la cantidad de registros díarios se desea el tamaño efectivo en disco requerido. Valiendome del módulo pgstattuple ( http://www.postgresql.org/docs/9.4/static/pgstattuple.html) y un query de stackoverflow ( http://dba.stackexchange.com/questions/23879/measure-the-size-of-a-postgresql-table-row) comprendí que puedo hacer una proyección estimada de la tabla dado que entendí que las filas ocupan un tamaño en bytes y que cada fila se acumulan para llenar páginas de 8kb. Ahora bien, el problema que con cada nueva fila, se van creando índices. Y el crecimiento del mismo es totalmente anormal e impredecible. De hecho resulta mayor el tamaño de ocupado por los índices que por la data de la tabla en si. Para una inserción de 10.000 registros observen lo que ocupa: what | bytes/ct | bytes_pretty | bytes_per_row -----------------------------------+----------+--------------+--------------- core_relation_size | 2015232 | *1968 kB* | 201 visibility_map | 0 | 0 bytes | 0 free_space_map | 24576 | 24 kB | 2 table_size_incl_toast | 2039808 | 1992 kB | 203 indexes_size | 3883008 | *3792 kB* | 388 total_size_incl_toast_and_indexes | 5922816 | 5784 kB | 592 live_rows_in_text_representation | 2621727 | 2560 kB | 262 ------------------------------ | | | row_count | * 10000* | | live_tuples | 10000 | | dead_tuples | 0 | | Para 10.000 registros se ocupa un tamaño de *1968 kB* y los índices *3792 kB* ¿Que experiencia tienen al respecto? Agradezco sus comentarios -- Saludos Cordiales.- Alfredo Rico. San Cristóbal - Venezuela.