PostgreSQL El gestor de bases de datos relacionales más avanzado del mundo Álvaro Herrera 2ndQuadrant Ltd. http://www.2ndquadrant.com/ http://www.postgresql.org/ Congreso Nacional de Ciencias y Tecnologías de la Información Potosí 2013
Praga 2013
Praga 2013 (2)
Praga 2013 (3)
Qué es PostgreSQL Sistema de almacenamiento y manipulación de datos Interoperable con otros DBMS: lenguaje SQL estándar Confiable, consistente, robusto (ACID) Potente, flexible, extensible Excelente rendimiento, escalable a hardware muy grande
Estadísticas Git 2.5M Núm. líneas en repositorio Git 2M 1.5M 1M 500k 6.0 7.0 7.2 7.4 8.0 8.1 8.2 8.3 8.4 9.0 9.1 9.2
Características principales Gran soporte de lenguaje SQL Transacciones, savepoints INNER JOIN, OUTER JOIN UNION, INTERSECT, EXCEPT subconsultas agrupamiento, agregación INFORMATION_SCHEMA WITH RECURSIVE Window functions (LAG, LEAD,...) disparadores (triggers)
Características principales (cont.) resistencia a fallas frente a cortes abruptos de energía (WAL) Replicación usando archivos WAL (9.0) Replicación en flujo (9.1) Replicación en cascada (9.2) hot standby Respaldos en caliente, respaldos continuos
Historia 1977 1985: Ingres Michael Stonebraker, University of California, Berkeley 1986 1994: Postgres M. Stonebraker, University of California, Berkeley 1994 1995: Postgres95 Jolly Chen, Andrew Yu 1996 presente: PostgreSQL Global Development Group Inicialmente, siete miembros en cinco países
PostgreSQL Global Development Group core team de 7 personas 38 major developers 16 empresas contribuyendo activamente RedHat, 2ndQuadrant, EnterpriseDB, VMWare, Redpill Linpro, Cybertec, Aster Data, SRA, NTT, Dalibo, End Point, OmniTI, Afilias, PGExperts, Credativ, Command Prompt
Ejemplos simples CREATE TABLE meteorologicas ( ciudad varchar(80), temp_min int, temp_max int, precip real, fecha date ); INSERT INTO meteorologicas VALUES ('Sucre', 25, 27, 0.25, '1994-11-27'); CREATE TABLE ciudades ( nombre varchar(80), ubicacion point ); INSERT INTO ciudades VALUES ('Sucre', '(-63.0, 10.6)');
Ejemplos simples (2) SELECT ciudad, temp_min AS min, temp_max AS max, precip, fecha, ubicacion FROM meteorologicas, ciudades WHERE ciudad = nombre; ciudad min max precip fecha ubicacion Sucre 25 27 0.25 1994-11-27 (-63.0,10.6)
Ejemplos avanzados Rangos (1)
Ejemplos avanzados Rangos (2) Presupuesto de $13.000 $15.000, autos en ese rango SELECT * FROM autos WHERE ( autos.precio_min <= 13000 AND autos.precio_min <= 15000 AND autos.precio_max >= 13000 AND autos.precio_max <= 15000 ) OR ( autos.precio_min <= 13000 AND autos.precio_min <= 15000 AND autos.precio_max >= 13000 AND autos.precio_max >= 15000 ) OR ( autos.precio_min >= 13000 AND autos.precio_min <= 15000 AND autos.precio_max >= 13000 AND autos.precio_max <= 15000 ) OR ( autos.precio_min >= 13000 AND autos.precio_min <= 15000 AND autos.precio_max >= 13000 AND autos.precio_max >= 15000 ) ORDER BY autos.precio_min;
Ejemplos avanzados Rangos (3) Presupuesto de $13.000 $15.000, autos en ese rango SELECT * FROM autos WHERE autos.rango_precio && int4range(13000, 15000, '[]') ORDER BY lower(autos.rango_precio) id nombre rango_precio 5 Suzuki Grand Nomade [11.000,15.001) 6 Mitsubishi Lancer [12.000,14.001)
Ejemplos avanzados jerarquías de datos WITH RECURSIVE x AS ( SELECT * FROM empleados WHERE empleado_id = 2 UNION ALL SELECT empleados.* FROM x JOIN empleados ON (empleados.jefe = x.empleado_id) ) SELECT * FROM x; empleado_id nombre jefe 2 Andrés 1 3 José 2 5 Felipe 2 4 Cecilia 3
Funciones ventana SELECT depto, empno, salario, avg(salario) OVER (PARTITION BY depto)::int AS prom, salario - avg(salario) OVER (PARTITION BY depto)::int AS dif FROM salarios ORDER BY dif DESC depto empno salario prom dif desarrollo 8 6000 5020 980 ventas 6 5500 5025 475 personal 2 3900 3700 200 desarrollo 11 5200 5020 180 desarrollo 10 5200 5020 180 ventas 1 5000 5025-25 personal 5 3500 3700-200 ventas 4 4800 5025-225 ventas 3 4800 5025-225 desarrollo 9 4500 5020-520 desarrollo 7 4200 5020-820
CTEs de escritura WITH eliminados AS ( ) DELETE FROM ONLY registro WHERE fecha >= '2009-01-01' AND fecha < '2009-02-01' RETURNING * INSERT INTO registro_200901 SELECT * FROM eliminados;
Comunidad Modelo de desarrollo Soporte informal listas de correo http://www.postgresql.org/list IRC (#postgresql-es, #postgresql en freenode.net) StackOverflow.com Proyectos relacionados contrib, github, PgFoundry Soporte comercial consultoría, soporte, capacitación, hosting,...
Comunidad
2ndQuadrant http://www.2ndquadrant.com/
Preguntas
Material de otras charlas Roland Sonnenschein, Three success stories, Praga 2013 Jonathan Katz, Range Types: your life will never be the same, Praga 2013 Greg Stark, Recursive Queries, Ottawa 2009 Hitoshi Harada, Windowing Functions, Ottawa 2009 David Fetter, Writable CTEs (the next big thing), Paris 2009