Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Por qué PostgreSQL me pone

Avatar for 8Kdata 8Kdata
April 05, 2014

Por qué 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.

Avatar for 8Kdata

8Kdata

April 05, 2014
Tweet

More Decks by 8Kdata

Other Decks in Programming

Transcript

  1. 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/
  2. 23 razones por las que... NO me pone PostgreSQL Y

    1 razón por la que... ME PONE PostgreSQL https://blog.engineyard.com/2012/data-engine-yard
  3. #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
  4. #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.
  5. #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
  6. #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
  7. #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 :)
  8. #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
  9. #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
  10. #9: PostgreSQL es muy rápido En un dual-socket Intel Xeon

    X5650 with 24GB RAM: (http://www.dragonflybsd.org/performance/)
  11. #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)
  12. #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
  13. #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> )
  14. #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 &&);
  15. #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
  16. #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, …
  17. #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
  18. #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;
  19. #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
  20. #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));
  21. #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;
  22. #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
  23. #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
  24. #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
  25. #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
  26. #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”? ;)
  27. #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)
  28. #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
  29. #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
  30. #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
  31. #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 :)