PostgreSQL - insert lento

 
Vista:
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

insert lento

Publicado por Jose (4 intervenciones) el 25/12/2019 17:06:54
Hola
Este es el escenario
1.- Se llama a una función(parámetros) que inserta dichos parámetros en una tabla
2.- Esta función se invoca tantas veces como registros se necesiten ingresar
3.- El 1er insert demora Ej: 100 ms, el 2do 120 ms ,..,etc. El nro. 30 demora 4 segundos
4.- El Timeline muestra como se incrementan progresivamente los tiempos en cada insert
5.- La función se invoca N veces dentro de un BEGIN - COMMIT

El insert es el mismo, los mismo valores.

Nota:
1.- 30 registros se demoran alrededor de un minuto
2.- Hice una prueba y dentro de la función inserté los 30 registros en una tabla temporal que al final inserte en la tabla real con un select a la temporal. El tiempo bajó a 13 seg. Pero está solución no me resulta factible.

Les agradeceré la ayuda
Saludos
js
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

insert lento

Publicado por Francisco (88 intervenciones) el 26/12/2019 14:41:41
Hola

Pues lo primero es saber las caracteristicas del servidor

.- cantidad de memoria en GB,
.- tipo de disco SSD o no
.- cantidad de cores,
.- cantidad de conexiones que atiende
.- Es un servidor standalone o lo compartes como servidor web
.- Version de postgres,


.-Cual es el lenguaje donde invocas a tu función INSERT?
.-Cantidad de indices que maneja tu tabla,
.-Cuantas relaciones foráneas contiene tu tabla
.-Volumen aproximado de datos que manejas
.-El postgres esta con su configuracion original?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

insert lento

Publicado por Jose (4 intervenciones) el 26/12/2019 15:08:36
Hola, los datos que me pides:

- cantidad de memoria en GB,
16 GB RAM
.- tipo de disco SSD o no
SSD - M2
.- cantidad de cores,
8 cores
.- cantidad de conexiones que atiende
las pruebas las hago en una maq. en la que no corre nada mas. En la maq. real y la de prueba igual resultado
.- Es un servidor standalone o lo compartes como servidor web
standalone
.- Version de postgres,
PostgreSQL 9.4.24 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23), 64-bit

.-Cual es el lenguaje donde invocas a tu función INSERT?
La función está construida en plpgsql
.-Cantidad de indices que maneja tu tabla,
2 indices. Uno al campo serial y otro a un campo integer. Ocupan 139 MB
.-Cuantas relaciones foráneas contiene tu tabla
Ninguna
.-Volumen aproximado de datos que manejas
BD 2539 MB. Esa tabla 111 MB 654151 registros
.-El postgres esta con su configuracion original?
Si

Te adjunto el Timeline des la app Web, pero invocar la función desde aqui y desde el pgadmin da el mismo resultado

Gracias, saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

insert lento

Publicado por Francisco (88 intervenciones) el 26/12/2019 21:09:12
Hola

La version 9.4.de potsgres ya esta "deprecated", asi que te recomiendo que migres a version 12 como minimo 11

Respaldar la base de datos

Antes de restaurar ejecuta lo siguientes por consola

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ALTER SYSTEM SET max_connections = '20';
ALTER SYSTEM SET shared_buffers = '1536MB';
ALTER SYSTEM SET effective_cache_size = '4608MB';
ALTER SYSTEM SET maintenance_work_mem = '384MB';
ALTER SYSTEM SET checkpoint_completion_target = '0.9';
ALTER SYSTEM SET wal_buffers = '16MB';
ALTER SYSTEM SET default_statistics_target = '100';
ALTER SYSTEM SET random_page_cost = '1.1';
ALTER SYSTEM SET effective_io_concurrency = '200';
ALTER SYSTEM SET work_mem = '19660kB';
ALTER SYSTEM SET min_wal_size = '2GB';
ALTER SYSTEM SET max_wal_size = '4GB';
ALTER SYSTEM SET max_worker_processes = '8';
ALTER SYSTEM SET max_parallel_workers_per_gather = '4';
ALTER SYSTEM SET max_parallel_workers = '8';

Luego reinicias postgres con

1
sudo service postgresql restart

Restaurar la base de datos

Testing

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

insert lento

Publicado por martin flores (121 intervenciones) el 01/01/2020 22:56:36
La versión del servidor no influye para nada, tenemos psql 8.x y vuelan, me parece que el problema esta en la función que inserta, podes pasar el código de la función?

Si hacer un un BEGIN COMMIT es por que estas haciendo controles y tiene alguna complejidad superior a un simple insert, de otra manera siempre te conviene dejar el auto commit y capturar la excepción, que básicamente hace un rollback de todo, que controles haces?

También puede ser los valores que insertas, si estas insertando geometrias(poligonos en particular) o datos binarios eso impacta en la performance y hay tratamientos para estos casos, pero si insertas cadenas con largos normales y otros numéricos insisto que el problema esta en la implementación de la función.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

insert lento

Publicado por js (4 intervenciones) el 01/01/2020 23:28:40
Hola
No, la función es muy simple, y no tiene Commit, eso lo hace la app web porque llama varias funciones para completar la tarea y si alguna falla hace el rollback
El insert es simple: Insert into nombretabla(campo1, campo2...) values dato1, dato2,...) todos varchar o integer
Como comenté antes, invocar la función desde el pgadmin de posgress produce igual resultado (no hay commit, y la función se encarga del rollbac automatico si se requiere como comentas)

1, 2 y 3 insert vuelan también, a partir del 4to los milisegundos aumentan exponencialmente
La prueba que hice fue pasarle a la función los datos de los 30 llamados, la función los separó, y con un cursor los recorrió insertando en una temporal con igual estructura que la tabla real. Al final a partir de esta temporal se inserta en la principal y así resulta muy rápido.

No soy conocedor de la forma en ue trabaja el motor posgres pero quizás la forma MVCC requiera parametrizar algo que desconozco

Si se hace desde el pgadmin cada llamado a la función es independiente, es decir, hizo un insert, y la función hace el commit automático
Lo que sucede es que la sesión que inicias en el pgadmin, esa sesión hace su begin automático y solo cierra después del llamado 30. En ese sentido es similar a lo que hace la app web

Feliz año !!!, gracias y saludos
js
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 9
Ha disminuido 1 puesto en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

insert lento

Publicado por Jose (4 intervenciones) el 12/02/2020 06:10:10
Hola
Me demoré un poco por x causas, pero ya Instalé la versión 12, el resultado es el mismo, el tiempo de inserción de 60 registros en la misma tabla aumenta, creo que exponencialmente
cuando son pocos, menos de 10 mas menos, no se nota tanto

Igual, gracias por la sugerencia
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar