Buenos días compañeros:
Hace tiempo tuve un problema "similar" que mandé a la lista y que resultó ser
un fallo en el diseño de una consulta. Ahora me sucede algo parecido con una
consulta lanzada en PostgreSQL, pero no creo que tenga que ver con el diseño de
la consulta. Les comento de forma detallada.
Tengo instalado Postgres 8.4 en un portátil con sistema operativo Windows 7, un
procesador de doble núcleo (1.3 GHz) y 4 GB de memoria RAM. He estado manejando
grandes cantidades de datos en Postgres hasta el momento (tablas de 20, 30 o
100 millones de tuplas) sin ningún tipo de problemas, incluso haciendo
diferentes JOINS. Sin embargo, llevo un par de días atascado con una consulta
en la que pretendo realizar un INNER JOIN entre dos tablas. La primera de ellas
cuenta con alrededor de 150 millones de tuplas, y la segunda con
aproximadamente 130 millones. El asunto es que cuando Postgres se dispone a
realizar la consulta consume todo el espacio de disco que me queda en el PC, y
por esta razón, no puede finalizar el cálculo de la consulta.
El espacio libre en disco que tengo en el PC asciende a 150 GBs, por lo que me
parece suficiente para que Postgres pueda realizar la consulta. Más aún, cuando
anteriormente he podido realizar consultas similares a ésta sin ningún tipo de
problema. Es por esto último por lo que me da que pensar que algo no está
funcionando bien en mi server. Podría deberse a una configuración errónea en el
archivo postgres.conf? Les detallo aquí las tablas que intervienen en la
consulta y el código sql de dicha consulta:
Tablas utilizadas en la consulta:
TABLA: normalized_coup -- alrededor de 150 millones de registros IDJ_ORIG
bigint IDJ_DEST bigint COUPLING bigint IDJ_SAHRED bigint
TABLA: normalized_cocit -- alrededor de 130 millones de registros IDJ_ORIG
bigint IDJ_DEST bigint COCITATION bigint IDJ_SAHRED bigintCódigo SQL
utilizado en la consulta:
SELECT normalized_coup."IDJ_ORIG", normalized_coup."IDJ_DEST",
normalized_cocit."COCITATION", normalized_coup."COUPLING"INTO
JOIN_coup_cocitFROM normalized_coup INNER JOIN normalized_cocit ON
(normalized_coup."IDJ_ORIG" = normalized_cocit."IDJ_ORIG") AND
(normalized_coup."IDJ_DEST" = normalized_cocit."IDJ_DEST") ;
Por si sirve de ayuda, cuando ejecuto la consulta, me voy al Monitor de
Recursos de Windows y en la parte de Disco he comprobado que la E/S de Disco
oscila entre 15-25 Mb/s. También me parece raro que si activas en el Monitor de
Recursos los procesos en funcionamiento en el equipo, donde podría visualizarse
el uso de CPU, Disco..., que realiza Potgres, no veo ninguna línea en el
gráfico que señale la cantidad de disco que está realmente utilizando Postgres
(con otras consultas, si que lo he podido apreciar). Además, no ocurre lo mismo
con los procesos asociados a la CPU, donde si puedo apreciar el uso que
Postgres está haciendo de ella. Por último el uso de la RAM muestra valores
oscilando entre los 200 MB y los 400 MB aproximadamente.
Bueno, pues espero haberme explicado bien y no liar más al personal. Hago
constar también que no soy usuario avanzado de Postgres, sólo soy un usuario
que maneja consultas en SQL que es para lo que lo necesito realmente.
Saludos y muchísimas gracias de antemano por vuestra atención!
Antonio J.