Download - Por qué PostgreSQL me pone
![Page 2: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/2.jpg)
La transparencia egocentrista
● Álvaro Hernández Tortosa <[email protected]>● Fundador y Director Técnico en NOSYS● ¿Qué hacemos en NOSYS?
✔ Formación, consultoría y desarrollo de software con PostgreSQL (y Java)✔ Partners de EnterpriseDB✔ Formación avanzada en Java con Javaspecialists.eu: Java Master Course y Java Concurrency Course✔ Partners de Amazon AWS. Formación y consultoría en AWS
● Twitter: @ahachete● LinkedIn: http://es.linkedin.com/in/alvarohernandeztortosa/
![Page 3: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/3.jpg)
23 razones por las que...
NO me ponePostgreSQL
Y 1 razónpor la que...
ME PONE PostgreSQL
https://blog.engineyard.com/2012/data-engine-yard
![Page 4: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/4.jpg)
#1Es demasiado fácil de
instalar
![Page 5: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/5.jpg)
#1: Es demasiado fácil de instalar
● Un sólo comando si es de paquete:
apt-get install postgresql-9.3
yum install postgresql93-server
● O un par si es compilando el código fuente
./configure && make installpg_ctl -D /var/lib/postgresql -E UTF-8
![Page 6: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/6.jpg)
#2La instalación ocupa
demasiado poco
![Page 7: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/7.jpg)
#2: La instalación ocupa demasiado poco
ubuntu@test:~$ sudo apt-get install postgresql-9.3Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libpq5 pgdg-keyring postgresql-client-9.3 postgresql-client-common postgresql-common ssl-cert
Suggested packages:
oidentd ident-server locales-all postgresql-doc-9.3 openssl-blacklist
The following NEW packages will be installed:
libpq5 pgdg-keyring postgresql-9.3 postgresql-client-9.3 postgresql-client-common postgresql-common ssl-cert
0 upgraded, 7 newly installed, 0 to remove and 14 not upgraded.
Need to get 4840 kB of archives.
After this operation, 23.2 MB of additional disk space will be used.
![Page 8: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/8.jpg)
#3Puedes conectarte
pulsando sólo 5 teclas
![Page 9: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/9.jpg)
#3: Puedes conectarte pulsando sólo 5 teclas
psql
Para ello es necesario, y práctico, crear un usuario de la base de datos con el mismo nombre que el usuario del S.O., y crear una base de datos también con ese mismo nombre:
postgres$ createuser --createdb --no-create-role \ aht
aht$ createdb aht
O para conectar a una base de datos arbitraria:psql -h host -p puerto base_de_datos usuario
![Page 10: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/10.jpg)
#4Es seguro por defecto
![Page 11: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/11.jpg)
#4: Es seguro por defecto
● Es muy aburrido, ¡tiene usuarios!
● Por defecto, sólo puedes conectarte desde localhost:➔ A través de sockets UNIX, como el mismo usuario del S.O.➔ A través de TCP/IP, típicamente con password
● Si quieres conectarte desde otras Ips:➔ Añade la(s) IP(s) en postgresql.conf, parámetro listen_addresses (formato CSV)➔ Edita pg_hba.conf para añadir la red (CIDR)desde donde se permita conectarse
![Page 12: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/12.jpg)
#5La licencia es muy
liberal
![Page 13: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/13.jpg)
#5: La licencia es muy liberal
Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted,
provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.
● PostgreSQL está bajo la licencia PostgreSQL License, que es muy similar a las licencias MIT o BSD.
● En resumen: haz lo que te dé la gana con el código :)
![Page 14: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/14.jpg)
#6Está soportado en casi cualquier plataforma
![Page 15: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/15.jpg)
#6: Está soportado en casi cualquier plataforma
● Sistemas Operativos:
Linux, Windows (Win2000 SP4 y posterior), FreeBSD, OpenBSD, NetBSD, Mac OS X, AIX, HP/UX, IRIX, Solaris, Tru64 Unix, y UnixWare
● Arquitecturas de CPU:
x86, x86_64, IA64, PowerPC, PowerPC 64, S/390, S/390x, Sparc, Sparc 64, Alpha, ARM, MIPS, MIPSEL, M68K, y PA-RISC
![Page 16: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/16.jpg)
#7El código tiene
demasiados comentarios
![Page 17: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/17.jpg)
#7: El código tiene demasiados comentarios
● Un 11% de las líneas de código C son comentarios:
aht@ushuaia:~/github/postgresql/src$for i in `find . -name '*.c'`;do orig=`wc -l $i|awk '{print $1}'`;without=`gcc -fpreprocessed -dD -E $i |wc -l |awk '{print $1}'`;echo $orig $without;done 2>/dev/null| awk '{t+= $1; c+= ($1-$2)} END { print c, t, c * 100 / t}'110319 1006481 10.9609
![Page 18: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/18.jpg)
#7: El código tieneDemasiados comentarios
Puedes encontrar el código en git.postgresql.orgy github
![Page 19: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/19.jpg)
#8Muchas grandes
empresas lo usan
![Page 20: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/20.jpg)
#8: Muchas grandes empresas lo usan
![Page 21: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/21.jpg)
#9PostgreSQL es muy
rápido
![Page 22: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/22.jpg)
#9: PostgreSQL es muy rápido
En un dual-socket Intel Xeon X5650 with 24GB RAM:(http://www.dragonflybsd.org/performance/)
![Page 23: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/23.jpg)
#9: PostgreSQL es muy rápido (II)
Escalabilidad hasta 64 cores, 8x8core AMD 6272:(http://rhaas.blogspot.com.es/2012/04/did-i-say-32-cores-how-about-64.html)
![Page 24: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/24.jpg)
#10Soporta demasiados
tipos de datos
![Page 25: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/25.jpg)
#10: Soporta demasiados tipos de datos
Tipos “habituales”
● int, bigint● serial, bigserial● varchar, text● real, double● boolean● date, time, timestamp● bytea● money● numeric● Arrays multidimensionales
Tipos “cool”
● json● xml● uuid● varbit● timestamptz● cidr● inet● macaddr● point, polygon, path,circle, box, line, lseg
![Page 26: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/26.jpg)
#11Se pueden crear tus
propios tipos de datos
![Page 27: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/27.jpg)
#11: Se pueden crear tus propios tipos de datos
● Crear una estructura (o tupla) como tipo de datos:CREATE TYPE name AS (att_name data_type [, ... ])
● Tipos enumerados:CREATE TYPE name AS ENUM ( [ 'label' [, ... ] ] )
● Tipos a partir de funciones de entrada/salida:CREATE TYPE name (INPUT = input_function, OUTPUT = output_function, … opciones … )
● DOMAINs:CREATE DOMAIN name AS <tipo_base> CHECK ( <restricciones_check> )
![Page 28: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/28.jpg)
#12Tiene tipos de datos
muy avanzados
![Page 29: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/29.jpg)
#12: Tiene tipos de datos muy avanzados:rangos (range types)
CREATE TABLE reservation (room int, during tsrange);INSERT INTO reservation VALUES (1108, '[2010-01-01 14:30, 2010-01-01 15:30)');-- ContainmentSELECT int4range(10, 20) @> 3;-- OverlapsSELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);-- Compute the intersectionSELECT int4range(10, 20) * int4range(15, 25);-- Crear una tabla para prevenir inserciones solapadasALTER TABLE reserva_salas ADD EXCLUDE USING gist (reservado WITH =, periodo WITH &&);
![Page 30: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/30.jpg)
#12: Tiene tipos de datos muy avanzados:interval y timestamptz
aht=> \tShowing only tuples.aht=> SELECT now() + interval '1 day'; 2014-03-21 15:13:32.938706+01aht=> SELECT now() + interval '1 day 3 minutes 2 hours 23 seconds'; 2014-03-21 17:17:05.626756+01aht=> SELECT now() + interval '1 day 3 minutes' * 30; 2014-04-19 16:44:03.530657+02aht=> SET TimeZone TO 'Asia/Tokyo'; SELECT now(); SET TimeZone TO 'Europe/Madrid'; SELECT now(); 2014-03-20 23:15:42.858534+09 2014-03-20 15:15:42.858901+01
![Page 31: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/31.jpg)
#13Tiene demasiadas
funciones
![Page 32: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/32.jpg)
#13: Tiene demasiadas funciones
● Funciones matemáticas: abs, ceil, exp, log, pi, power, radians, round, random, sqrt, trunc, …
● Funciones de texto: ascii, btrim, convert, encode, decode, initcap, length, md5, replace, …
● Búsqueda de patrones: LIKE, SIMILAR TO, ~
● Formateado: to_char, to_<tipodatos>
● Funciones para tipos geométricos, json, xml, arrays, expresiones condicionales, búsqueda de texto completo, gestión secuencias, …
![Page 33: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/33.jpg)
#14Tiene funcionalidades SQL muy avanzadas
![Page 34: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/34.jpg)
#14: Tiene funcionalidades SQL muy avanzadas:queries recursivas
WITH RECURSIVE t(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM t WHERE n < 100) SELECT sum(n) FROM t;
WITH RECURSIVE subdepartment AS ( SELECT * FROM department WHERE name = 'A' UNION ALL SELECT d.* FROM department AS d JOIN subdepartment AS sd ON (d.parent_department = sd.id)) SELECT * FROM subdepartment ORDER BY name;
http://www.slideshare.net/nosys/ct-es-queriesrecursivas
![Page 35: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/35.jpg)
#14: Tiene funcionalidades SQL muy avanzadas:window functions
SELECT when - lag(when, 1) OVER ( PARTITION BY agent_uuid ORDER BY when ) AS durationFROM metrics;
SELECT date, x, count(x) OVER (partition by date, x), array_agg(x) over(partition by date), array_agg(x) over(partition by date, x)FROM p;
![Page 36: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/36.jpg)
#14: Tiene funcionalidades SQL muy avanzadas: (9.4) filtros en agregados y agregados hipotéticosSELECT pais, count(*) AS usuarios,count(*) FILTER (WHERE activo) usuarios_activosFROM usuarios GROUP BY pais;
INSERT INTO i VALUES (1), (100);SELECT percentile_cont(.2) WITHIN GROUP (ORDER BY i) FROM i; percentile_cont ----------------- 20.8SELECT rank(5) WITHIN GROUP (ORDER BY i) FROM i; rank ------ 2
![Page 37: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/37.jpg)
#14: Tiene funcionalidades SQL muy avanzadas: Índices parciales
● Índices parciales: se trata de índices sobre un subconjunto de valores de una tabla. Permiten reducir el tamaño del índice, eliminando valores que no importan:
CREATE INDEX tabla_indice ON tabla (cols) WHERE NOT borrado;
● Índices sobre expresiones: se pueden crear índices no sólo sobre columnas existentes, sino también sobre expresiones arbitrarias sobre las columnas:
CREATE INDEX tabla_indiceON tabla (lower(nombre));
![Page 38: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/38.jpg)
#15Soporta DDL transaccional
![Page 39: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/39.jpg)
#15: Soporta DDL transaccional
BEGIN;CREATE TABLE borrar (i integer);INSERT INTO borrar VALUES (8);SELECT * FROM borrar; i --- 8ROLLBACK;SELECT * FROM borrar;ERROR: relation "borrar" does not existLINE 1: SELECT * FROM borrar;
![Page 40: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/40.jpg)
#16Soporta muchos
lenguajes procedurales
![Page 41: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/41.jpg)
#16: Soporta muchos lenguajes procedurales
● Para triggers, procedimientos almacenados o checks
● Se pueden programar en:➔ PL/pgsql➔ PL/Python➔ PL/v8➔ PL/Perl➔ PL/Java➔ PL/bash➔ PL/R➔ PL/lolcat!!!!!!!!!
http://www.slideshare.net/linuxpoet/developing-a-procedural-language-for-postgre-sql
![Page 42: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/42.jpg)
#17Tiene muchas extensiones
![Page 43: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/43.jpg)
#17: Tiene muchas extensiones
● pg_buffercache – inspecciona la memoria● pg_tgrm – búsqueda por palabras similares● pgcrypto – funciones de cifrado● unaccent – quita tildes, eñes, etc● pl/proxy !!!! – ejecutar funciones en otras dbs● pg_jobmon –logging y monitorización● Intarray – operaciones sobre arrays de enteros no nulos● Ip4r – funciones avanzadas de IPv4 y IPv6
… y algunas más que vemos más adelante
![Page 44: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/44.jpg)
#18PostGIS
![Page 45: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/45.jpg)
#18: PostGIS
● Es el software de GIS más avanzado del mundo. Es una extensión de PostgreSQL, que crea tipos de datos, funciones y tablas de referencia.
● Permite hacer consultas georreferenciadas como obtener una región de 50km alrededor de los ríos de EEUU de los estados del oeste:SELECT ST_Union(ST_Intersection(ST_Buffer(r.the_geom,50000),s.the_geom)) FROM usa_rivers as r, usa_states as s WHERE ST_Intersects(r.the_geom, s.the_geom) AND s.region = 'West' GROUP BY state
![Page 46: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/46.jpg)
#19Es también NoSQL
![Page 47: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/47.jpg)
#19: Es también NoSQL: hstore
● Es una extensión, que permite almacenar pares clave-valor en una columna. ¡Y recursivos desde 9.4!
CREATE EXTENSION hstore;INSERT INTO hstore_test (data) VALUES ('"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"');
SELECT * FROM hstore_test WHERE data ? 'key4';SELECT data -> 'key4' FROM hstore_test;SELECT item_id, (each(data)).* FROM hstore_test
![Page 48: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/48.jpg)
#19: Es también NoSQL: json
● Es un tipo de datos nativo.
● Se almacena como texto, pero valida sintaxis json.
● Dispone de múltiples funciones y operadores, similares a hstore.
● Desde 9.4 existirá jsonb, que almacena en binario (pero no es BSON).
● ¿Se puede almacenar json sin “hacer el mongo”? ;)
![Page 49: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/49.jpg)
#20Tiene muchas soluciones de
replicación y HA
![Page 50: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/50.jpg)
#20: Tiene muchas soluciones de replicación y HA
● Replicación binaria en el core:➔ Maestro / varios (muchos) esclavos➔ R/W maestro, R/O esclavos➔ Soporta cascadas➔ Síncrono o asíncrono (¡incluso por tx!)➔ Muy rápido (normalmente, sub-segundo)➔ Requiere la misma arquitectura➔ Replica el cluster (todas las bases de datos) entero
● En 9.5 ó 10: replicación lógica en el core, bi-direccional (maestro-maestro)
![Page 51: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/51.jpg)
#20: Tiene muchas soluciones de replicación y HA
● Replicación lógica con Slony:➔ Compatible entre diferentes arquitecturas y versiones de Postgres➔ Permite seleccionar subonconjuntos de tablas a replicar➔ Replicación asíncrona, permite replicación MAN➔ Soporta cascadas. Los esclavos son r/o también
● Replicación con Bucardo:➔ Dos maestros o maestro-esclavo(s)➔ Asíncrona➔ Handler de conflictos estándar o a medida
![Page 52: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/52.jpg)
#20: Tiene muchas soluciones de replicación y HA
● Alta disponibilidad con pgpool:➔ Hace de pooling de conexiones (como pgbouncer)➔ Si un servidor cae, la conexión con pgpool no, y sirve carga a los demás➔ Entiende la replicación (core o Slony) y divide r/w entre los servidores esclavo(s)/maestro➔ Permite ejecutar scripts ante eventos de HA➔ Tiene un modo de HA para no ser SPOF
![Page 53: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/53.jpg)
#21Esos impronunciables
FDWs
![Page 54: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/54.jpg)
#21: Esos impronunciables FDWs
● Los Foreign Data Wrappers permiten acceder a otras fuentes de datos desde dentro de PostgreSQL, como:
➔ postgres_fdw – habilita tx autónomas➔ {oracle,mysql,odbc,jdbc,firebird,sqlite}_fdw➔ {couchdb,mongo,redis,neo4j}_fdw➔ file_fdw, json_fdw➔ twitter_fdw➔ s3_fdw➔ www_fdw➔ Multicorn: programa FDWs en Python
![Page 55: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/55.jpg)
#22Es “ácido” de verdad
![Page 56: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/56.jpg)
#23Custom Background
Workers
![Page 57: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/57.jpg)
#23: Custom Background Workers
● Funcionalidad en PostgreSQL para poder lanzar tus propios procesos, cuyo ciclo de vida gestiona postgres.
● Tienen acceso parcial o total a la memoria de postgres, y pueden realizar tareas como:
➔ kill_idle: cierra conexiones inactivas más de un tiempo➔ config_log: monitoriza cambios en postgresql.conf y los guarda en una tabla➔ ¿pg_cron?➔ Mongres➔ you name it :)
![Page 58: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/58.jpg)
Pero sólo hay UNArazón por la que ME
PONE
![Page 59: Por qué PostgreSQL me pone](https://reader031.vdocumento.com/reader031/viewer/2022013118/557b4abed8b42a8c528b4c36/html5/thumbnails/59.jpg)