Re: insertar registros e indice de una tabla

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: josefermin54 <josefermin54(at)hotmail(dot)com>
Cc: Lista PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: insertar registros e indice de una tabla
Date: 2011-03-23 21:18:08
Message-ID: 1300913515-sup-7562@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Excerpts from josefermin54's message of mié mar 23 14:53:41 -0300 2011:
>
> Buenas tardes amigos, mi pregunta de hoy es acerca de una tabla a la que se van a insertar 2 millones de registros provenientes de un archivo de texto, ahora bien en esa tabla se creo un indice para hacer las búsquedas más ágiles, pero, antes de crear el índice la insercción de registros se hacía con una muy rapidez buena (en una hora se insertaron 600 mil registros y ahora con el índice en una hora sólo se pudieron insertar 23 mil registros). Mi pregunta es tiene que ver algo el índice creado con la rapidez de insercción. Y si existe de alguna forma de poder insertar registros con más rapidez desde un archivo de texto.
> Sistema operativo utilizado: Windows 7Postgresql 8.4Método utilizado: btreecampo al que se le creó índice: codigocantidad de índices en la tabla: 1En el momento último de insercción de registros solo estaba utilizando: pgadmin y el programa para insertar registros desde el archivo de texto.

Algo anda profundamente mal con tu sistema. Acá hice una prueba rápida:
primero creo un archivo de texto con un millón de líneas. Luego creo
una tabla, sin índices, y le inserto con COPY las líneas desde el
archivo. Se demora 8 segundos. Luego trunco la tabla, creo un índice,
vuelvo a insertar el mismo millón de registros. Se demora 17 segundos.

Esta es una máquina de escritorio que no tiene nada del otro mundo.

$ seq 1 1000000 > /tmp/unmillon
$ ls -l /tmp/unmillon
-rw-r--r-- 1 alvherre alvherre 6888896 mar 23 17:52 /tmp/unmillon

alvherre=# create table unmillon (a int);
CREATE TABLE
alvherre=# \timing
El despliegue de duración está activado.
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 8488,785 ms
alvherre=# truncate table unmillon;
TRUNCATE TABLE
Duración: 54,189 ms
alvherre=# create index f on unmillon (a);
CREATE INDEX
Duración: 141,347 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 17252,609 ms

Repetí la inserción varias veces sin truncate para ver cómo cambiaban
los tiempos, y se fueron haciendo progresivamente peores pero no mucho
(como se espera):

alvherre=# truncate table unmillon ;
TRUNCATE TABLE
Duración: 55,474 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 12552,902 ms
alvherre=# commit;
COMMIT
Duración: 74,718 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 25170,691 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 21487,533 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 28824,152 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 30203,438 ms
alvherre=# copy unmillon from '/tmp/unmillon';
COPY 1000000
Duración: 27992,940 ms

--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Angelo Astorga 2011-03-23 21:27:29 Re: Exponer procedimientos almacenados como web services
Previous Message Jose David Verbel Tous 2011-03-23 20:58:14 Re: Problemas con COPY