Your SlideShare is downloading. ×

Por qué PostgreSQL me pone

1,133

Published on

Todas las razones por las que PostgreSQL me pone... …

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.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,133
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
26
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Por qué PostgreSQL me pone Álvaro Hernández Tortosa <aht@Nosys.es>
  • 2. 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/
  • 3. 23 razones por las que... NO me pone PostgreSQL Y 1 razón por la que... ME PONE PostgreSQLhttps://blog.engineyard.com/2012/data-engine-yard
  • 4. #1 Es demasiado fácil de instalar
  • 5. #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 install pg_ctl -D /var/lib/postgresql -E UTF-8
  • 6. #2 La instalación ocupa demasiado poco
  • 7. #2: La instalación ocupa demasiado poco ubuntu@test:~$ sudo apt-get install postgresql-9.3 Reading 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.
  • 8. #3 Puedes conectarte pulsando sólo 5 teclas
  • 9. #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
  • 10. #4 Es seguro por defecto
  • 11. #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
  • 12. #5 La licencia es muy liberal
  • 13. #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 :)
  • 14. #6 Está soportado en casi cualquier plataforma
  • 15. #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
  • 16. #7 El código tiene demasiados comentarios
  • 17. #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
  • 18. #7: El código tiene Demasiados comentarios Puedes encontrar el código en git.postgresql.org y github
  • 19. #8 Muchas grandes empresas lo usan
  • 20. #8: Muchas grandes empresas lo usan
  • 21. #9 PostgreSQL es muy rápido
  • 22. #9: PostgreSQL es muy rápido En un dual-socket Intel Xeon X5650 with 24GB RAM: (http://www.dragonflybsd.org/performance/)
  • 23. #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)
  • 24. #10 Soporta demasiados tipos de datos
  • 25. #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
  • 26. #11 Se pueden crear tus propios tipos de datos
  • 27. #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> )
  • 28. #12 Tiene tipos de datos muy avanzados
  • 29. #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)'); -- Containment SELECT int4range(10, 20) @> 3; -- Overlaps SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0); -- Compute the intersection SELECT int4range(10, 20) * int4range(15, 25); -- Crear una tabla para prevenir inserciones solapadas ALTER TABLE reserva_salas ADD EXCLUDE USING gist (reservado WITH =, periodo WITH &&);
  • 30. #12: Tiene tipos de datos muy avanzados: interval y timestamptz aht=> t Showing only tuples. aht=> SELECT now() + interval '1 day'; 2014-03-21 15:13:32.938706+01 aht=> SELECT now() + interval '1 day 3 minutes 2 hours 23 seconds'; 2014-03-21 17:17:05.626756+01 aht=> SELECT now() + interval '1 day 3 minutes' * 30; 2014-04-19 16:44:03.530657+02 aht=> 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
  • 31. #13 Tiene demasiadas funciones
  • 32. #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, …
  • 33. #14 Tiene funcionalidades SQL muy avanzadas
  • 34. #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
  • 35. #14: Tiene funcionalidades SQL muy avanzadas: window functions SELECT when - lag(when, 1) OVER ( PARTITION BY agent_uuid ORDER BY when ) AS duration FROM 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;
  • 36. #14: Tiene funcionalidades SQL muy avanzadas: (9.4) filtros en agregados y agregados hipotéticos SELECT pais, count(*) AS usuarios, count(*) FILTER (WHERE activo) usuarios_activos FROM usuarios GROUP BY pais; INSERT INTO i VALUES (1), (100); SELECT percentile_cont(.2) WITHIN GROUP (ORDER BY i) FROM i; percentile_cont ----------------- 20.8 SELECT rank(5) WITHIN GROUP (ORDER BY i) FROM i; rank ------ 2
  • 37. #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_indice ON tabla (lower(nombre));
  • 38. #15 Soporta DDL transaccional
  • 39. #15: Soporta DDL transaccional BEGIN; CREATE TABLE borrar (i integer); INSERT INTO borrar VALUES (8); SELECT * FROM borrar; i --- 8 ROLLBACK; SELECT * FROM borrar; ERROR: relation "borrar" does not exist LINE 1: SELECT * FROM borrar;
  • 40. #16 Soporta muchos lenguajes procedurales
  • 41. #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
  • 42. #17 Tiene muchas extensiones
  • 43. #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
  • 44. #18 PostGIS
  • 45. #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
  • 46. #19 Es también NoSQL
  • 47. #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
  • 48. #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”? ;)
  • 49. #20 Tiene muchas soluciones de replicación y HA
  • 50. #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)
  • 51. #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
  • 52. #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
  • 53. #21 Esos impronunciables FDWs
  • 54. #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
  • 55. #22 Es “ácido” de verdad
  • 56. #23 Custom Background Workers
  • 57. #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 :)
  • 58. Pero sólo hay UNA razón por la que ME PONE

×