Proyectar cálculo del tamaño de índices.

From: Alfredo Rico <alfredorico(at)gmail(dot)com>
To: Postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Proyectar cálculo del tamaño de índices.
Date: 2016-03-29 23:34:26
Message-ID: CAGWUuq259QT1StyuciAEC1=Jf-cEH7BRjc8tHLvZ2d-xQg0EpA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gerardo Herzig 2016-03-30 01:54:55 Re: Proyectar cálculo del tamaño de índices.
Previous Message Anthony Sotolongo 2016-03-29 18:43:01 Re: Dudas sobre postgres - wal