Por qué PostgreSQL me pone

59
Por qué PostgreSQL me pone Álvaro Hernández Tortosa <[email protected]>

description

Todas las razones por las que PostgreSQL me pone... Todas las características que tienen PostgreSQL que lo hacen una base de datos excepcional. Se hablará de rendimiento, durabilidad, tipos de datos, funciones, extensiones, NoSQL, replicación, alta disponibilidad, licencia, calidad del código.... todo lo que rodea a esta base de datos software libre.

Transcript of Por qué PostgreSQL me pone

Page 1: Por qué PostgreSQL me pone

Por qué PostgreSQL me pone

Álvaro Hernández Tortosa <[email protected]>

Page 2: Por qué PostgreSQL me pone

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

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

#1Es demasiado fácil de

instalar

Page 5: Por qué PostgreSQL me pone

#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

#2La instalación ocupa

demasiado poco

Page 7: Por qué PostgreSQL me pone

#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

#3Puedes conectarte

pulsando sólo 5 teclas

Page 9: Por qué PostgreSQL me pone

#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

#4Es seguro por defecto

Page 11: Por qué PostgreSQL me pone

#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

#5La licencia es muy

liberal

Page 13: Por qué PostgreSQL me pone

#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

#6Está soportado en casi cualquier plataforma

Page 15: Por qué PostgreSQL me pone

#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

#7El código tiene

demasiados comentarios

Page 17: Por qué PostgreSQL me pone

#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

#7: El código tieneDemasiados comentarios

Puedes encontrar el código en git.postgresql.orgy github

Page 19: Por qué PostgreSQL me pone

#8Muchas grandes

empresas lo usan

Page 20: Por qué PostgreSQL me pone

#8: Muchas grandes empresas lo usan

Page 21: Por qué PostgreSQL me pone

#9PostgreSQL es muy

rápido

Page 22: Por qué PostgreSQL me pone

#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

#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

#10Soporta demasiados

tipos de datos

Page 25: Por qué PostgreSQL me pone

#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

#11Se pueden crear tus

propios tipos de datos

Page 27: Por qué PostgreSQL me pone

#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

#12Tiene tipos de datos

muy avanzados

Page 29: Por qué PostgreSQL me pone

#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

#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

#13Tiene demasiadas

funciones

Page 32: Por qué PostgreSQL me pone

#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

#14Tiene funcionalidades SQL muy avanzadas

Page 34: Por qué PostgreSQL me pone

#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

#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

#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

#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

#15Soporta DDL transaccional

Page 39: Por qué PostgreSQL me pone

#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

#16Soporta muchos

lenguajes procedurales

Page 41: Por qué PostgreSQL me pone

#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

#17Tiene muchas extensiones

Page 43: Por qué PostgreSQL me pone

#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

#18PostGIS

Page 45: Por qué PostgreSQL me pone

#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

#19Es también NoSQL

Page 47: Por qué PostgreSQL me pone

#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

#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

#20Tiene muchas soluciones de

replicación y HA

Page 50: Por qué PostgreSQL me pone

#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

#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

#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

#21Esos impronunciables

FDWs

Page 54: Por qué PostgreSQL me pone

#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

#22Es “ácido” de verdad

Page 56: Por qué PostgreSQL me pone

#23Custom Background

Workers

Page 57: Por qué PostgreSQL me pone

#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

Pero sólo hay UNArazón por la que ME

PONE

Page 59: Por qué PostgreSQL me pone