Por qué PostgreSQL me pone

Post on 13-Jun-2015

1.188 views 6 download

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

Por qué PostgreSQL me pone

Álvaro Hernández Tortosa <aht@Nosys.es>

La transparencia egocentrista

● Álvaro Hernández Tortosa <aht@Nosys.es>● 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/

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

#1Es demasiado fácil de

instalar

#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

#2La instalación ocupa

demasiado poco

#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.

#3Puedes conectarte

pulsando sólo 5 teclas

#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

#4Es seguro por defecto

#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

#5La licencia es muy

liberal

#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 :)

#6Está soportado en casi cualquier plataforma

#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

#7El código tiene

demasiados comentarios

#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

#7: El código tieneDemasiados comentarios

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

#8Muchas grandes

empresas lo usan

#8: Muchas grandes empresas lo usan

#9PostgreSQL es muy

rápido

#9: PostgreSQL es muy rápido

En un dual-socket Intel Xeon X5650 with 24GB RAM:(http://www.dragonflybsd.org/performance/)

#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)

#10Soporta demasiados

tipos de datos

#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

#11Se pueden crear tus

propios tipos de datos

#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> )

#12Tiene tipos de datos

muy avanzados

#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 &&);

#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

#13Tiene demasiadas

funciones

#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, …

#14Tiene funcionalidades SQL muy avanzadas

#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

#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;

#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

#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));

#15Soporta DDL transaccional

#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;

#16Soporta muchos

lenguajes procedurales

#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

#17Tiene muchas extensiones

#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

#18PostGIS

#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

#19Es también NoSQL

#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

#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”? ;)

#20Tiene muchas soluciones de

replicación y HA

#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)

#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

#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

#21Esos impronunciables

FDWs

#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

#22Es “ácido” de verdad

#23Custom Background

Workers

#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 :)

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

PONE