Cargando datos con COPY FROM y WHERE en PostgreSQL 12

Desde la reciente versión 12 de PostgreSQL se permite utilizar la clausula WHERE en un comando COPY FROM, el cual permite cargar datos para una tabla desde el sistema de archivos en un servidor PostgreSQL filtrando los datos que no se desean, puede consultar los detalles en:

https://www.postgresql.org/docs/12/sql-copy.html

Esta actividad antes de la versión 12 solo se podía lograr cargando los datos en la tabla y luego borrando los que no se deseaban con un DELETE, por lo cual esta opción de filtrar los datos desde su carga viene siendo una mejora considerable para este proceso. Veamos un ejemplo de uso y las opciones que brinda:


CREATE TABLE copy_where (i int, t text);


--Generamos 100 datos

COPY (select i, md5(i::text) from generate_series (1,100) as i) to '/tmp/dat100.csv' csv header ;

--Generamos 10000 datos

COPY (select i, md5(i::text) from generate_series (1,10000) as i) to '/tmp/dat.csv' csv header ;

--Hacemos la carga de los 10000 datos en la tabla

pruebas12=# copy copy_where from '/tmp/dat.csv' csv header;
COPY 10000
Duración: 135,634 ms

--truncamos la tabla para aplica el WHERE para que solo cargue los datos i <= 100

pruebas12=# truncate copy_where ;

--cargamos solo 100 datos filtrando con el WHERE los datos que cumplan determinada condición, en este caso que la i <=100

copy copy_where from '/tmp/dat.csv' csv header WHERE i <= 100;
COPY 100
Duración: 21,645 ms

Ahora si se hace la carga de 100 datos solamente, se puede observar un penalizacion por el uso del  WHERE, lo cual es lógico pues debe realizar el filtro en la carga


pruebas12=# copy copy_where from '/tmp/dat100.csv' csv header;
COPY 100
Duración: 15,350 ms

 

Hay que tener en cuenta que no se permite utilizar subconsultas en el WHERE del COPY FROM, pues la documentación indica que no es posible:

 

…Currently, subqueries are not allowed in WHERE expressions, and the evaluation does not see any changes made by the COPY itself (this matters when the expression contains calls to VOLATILE functions)…
pruebas12=# copy copy_where from '/tmp/dat.csv' csv header WHERE i in ( select oid from pg_database);
ERROR: no se puede usar una subconsulta en la condición WHERE de COPY FROM
LÍNEA 1: ...copy_where from '/tmp/dat.csv' csv header WHERE i in ( sele...

Como vemos PostgreSQL no se detiene en su evolución y cada versión nos sorprende con detalles bien útiles como este de COPY FROM WHERE

Nos vemos en otra 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s