Re: Problemas con el espacio de disco al ejecutar una consulta

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: anxusgo <anxusgo(at)hotmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problemas con el espacio de disco al ejecutar una consulta
Date: 2010-08-03 21:43:50
Message-ID: 1280871158-sup-3773@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Excerpts from anxusgo's message of lun ago 02 05:11:19 -0400 2010:
>
> Hola:
>
> Antes de nada, gracias por su atención. Les informo acerca del problema que tengo con una consulta que pretendo realizar en una base de datos creada en Postgre. Primero, hago constar que soy totalmente nuevo en el uso, manejo y administración de Postgre.

Lo que primero me pregunto es qué tanta experiencia tienes manejando el
modelo relacional. La verdad es que no me queda claro qué es lo que
quieres lograr con esto.

> A partir de ellas, pretendo crear la siguiente consulta:
>
> INSERT INTO iteracion1 SELECT tabla_enlaces_rev_rev_nodupl_agrup.idrev_origen, tabla_enlaces_rev_rev_nodupl_agrup.idrev_destino, tabla_enlaces_iteracion1.id_cat, tabla_enlaces_rev_rev_nodupl_agrup.valor
> FROM tabla_enlaces_iteracion1 INNER JOIN tabla_enlaces_rev_rev_nodupl_agrup ON tabla_enlaces_iteracion1.id_rev = tabla_enlaces_rev_rev_nodupl_agrup.idrev_destino

Mostraste iteracion1 en vez de tabla_enlaces_iteracion1. En cualquier
caso las consultas son más legibles si usas unos pocos alias
juiciosamente, por ej:

INSERT INTO iteracion1 SELECT ter.idrev_origen, ter.idrev_destino, tei.id_cat, ter.valor
FROM tabla_enlaces_iteracion1 AS tei INNER JOIN tabla_enlaces_rev_rev_nodupl_agrup AS ter ON tei.id_rev = ter.idrev_destino

> CREATE TABLE iteracion1
> (
> idrev_origen double precision,
> idrev_destino double precision,
> id_cat integer,
> valor integer
> )
> WITH (
> OIDS=FALSE
> )
>
> El problema por el que les pido ayuda es que al ejecutarse la consulta (cuyo fin es almacenar la información en la tabla iteracion1), si bien, el funcionamiento es completamente correcto, el consumo de espacio físico en el disco duro es bestial, correspondiendo aproximádamente a unos 20 Gb por cada 8 millones de registros almacenados (aproximádamente). No soy un usuario experto en el mundo de las bases de datos, pero me parece que este consumo de espacio es exagerado para una tabla que únicamente contiene números.

Vamos a ver, cada tupla tiene 24 bytes de datos (8 por cada double
precision y 4 por cada integer), o sea como 52 bytes una vez almacenado
contando el encabezado y el line pointer; entonces en cada página de
8192 bytes caben unos 157 registros. Siendo generosos dejémoslo en 160.
Entonces, 8 millones de registros ocupan 50000 páginas, o sea como 390 MB.
Claramente hay algo mal, ¿quizás sea mi aritmética? ¿O quizás tu
consulta hace un producto cartesiano por algún motivo?

Lo más fácil es quitar el INSERT INTO y ver si la cantidad de registros
devueltos coincide con tus expectativas.

--
Álvaro Herrera <alvherre(at)commandprompt(dot)com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2010-08-03 23:05:12 Re: postgres - Se ha forzado la interrupcion de una conexion existente por el host remoto
Previous Message Jose Luis Balle 2010-08-03 20:41:09 Fwd: MUCHA ATENCIÓN