3. PostgreSQL
Considerado como el SGBD de código
abierto más avanzado del mundo
+ de 20 años de desarrollo
Ciclo de desarrollo bien definido estilo
FreeBSD Committers Dev Process
Modelo de desarrollo viable
(Empresas/Comunidad)
4. PostgreSQL
Basado en el trabajo de Stonebraker
Desarrollado en C89 (ANSI C)
Soporte excelente en las listas
Excelente documentación
Sumamente adaptable y extensible
Guiado por los estándares
5. Características
100 % ACID
Soporte para triggers,vistas, procedimientos
almacenados, funciones y tipos de datos
definidos por el usuario, búsqueda de textos
completos, etc
Corre en + de 30 plataformas incluyendo
Linux, UNIX, HP-UX, Solaris, BSD´s
Windows,etc
Licencia BSD (Costo es saber usarlo)
6. Características
Soporte para bases de datos georeferenciales
(PostGIS)
Pueden escribir sus funciones en + de 10
lenguajes (PL/pgSQL, PL/Ruby, PL/R,
C/C++, PL/Python, PL/Perl, PL/Java)
Prionero en los conceptos MVCC
WAL (Escritura adelantada de logs)
Tipado avanzado de datos (CHECK, ENUM,
DOMAIN)
7. PostgreSQL-8.4
Nueva implementación del FSM
Funciones ventana (Data WareHouse/OLAP
Apps)
CTE´s (Cláusula WITH)
Consultas recursivas (WITH recursivo !!!!)
Permisos por columnas
8. PostgreSQL-8.4
Estructura de control CASE
Comando TABLE
Argumentos de funciones variables
Argumentos con valores por defecto
Triggers en TRUNCATE
9. PostgreSQL-8.4
Mejoras del soporte a la plataforma Windows
Mejoras en el rendimiento de las DBA Tool
(VACUUM)
Restauración paralela de las bases de datos
(pg_restore -j #)
LIMIT puedes aceptar subquerys
Múltiples mejoras a psql (dt+; ef)
10. Ejemplos
Permisos por columnas:
GRANT SELECT (year),INSERT (valor),
UPDATE(otrovalor) ON tabla TO usuario;
Para TRUNCATE:
GRANT TRUNCATE ON tabla TO usuario;
11. Ejemplos
Funciones ventana:
SELECT year, sum(valor) OVER (PARTITION BY
year) FROM winpro LIMIT 10;
RETURN TABLE (alias para SETOF):
Parámetros por defecto:
CREATE FUNCTION f101 (int, int DEFAULT 9)
12. Ejemplos
CTE ( WITH):
WITH epic_films as (SELECT film_id,
array_agg(first_name ||' '||
last_name) as featuring FROM film join
film_actor using (film_id) JOIN actor
USING (actor_id) GROUP BY film_id )
SELECT * FROM epic_films WHERE
array_upper(featuring,1) > 12 ;
13. Ejemplos
CASE:
CREATE FUNCTION kidsafe(v_title text) RETURNS text
AS $$
BEGIN
CASE (select rating from film where title = v_title)
WHEN 'NC-17','R' THEN RETURN 'no';
WHEN 'PG-13' THEN RETURN 'maybe';
WHEN 'PG','G' THEN RETURN 'yes';
END CASE;
END; $$ LANGUAGE plpgsql;
14. Ejemplos
LIMIT basado en una subconsulta:
SELECT title FROM film ORDER BY random()
LIMIT (SELECT count(*)/10 FROM film WHERE
rating = 'G');
15. 9.0 !!!
Se introdujo un nuevo cambio en el proceso
de desarrollo:
http://commitfest.postgresql.org
La versión actual es la 9.0alpha5
Cambió de 8.5 a 9.0 por las características
tan radicales que trae (Hot
Standby/Streaming Replication)
16. Planes Futuros
Hot Standby … replicación sincrónica … exclusión
de restricciones … EXPLAIN con resultados en
JSON/XML/YAML … Windows 64 bits … CTE´s
modificables … mejora en los permisos …
GRANT ON ALL/DEFAULT … mejoras en el SQL
.. Agregados ordenados … Cláusula DO() …
mejoras de rendimiento … nuevo
LISTEN/NOTIFY … mejoras a PL/Perl y
PL/Python
17. Futuro ???
Hot Standby … replicación sincrónica … exclusión
de restricciones … EXPLAIN con resultados en
JSON/XML/YAML … Windows 64 bits … CTE´s
modificables … mejora en los permisos …
GRANT ON ALL/DEFAULT … mejoras en el SQL
.. Agregados ordenados … Cláusula DO() …
mejoras de rendimiento … nuevo
LISTEN/NOTIFY … mejoras a PL/Perl y
PL/Python
18. Plan de Desarrollo
9.0 RC / Período de desarrollo 1ro de Julio del 2009
CommitFest 1/Período de Julio 15 – Agosto 15 2009
desarrollo
CommitFest 2/Período de Sept. 15 – Oct. 15 2009
desarrollo
CommitFest 3/Período de Nov. 15 – Dic. 15 2009
desarrollo
CommitFest 4 Enero 15 2010
Limpieza / Integración y Revisión Febrero 15 2010
(2-4 semanas)
Liberación del Beta / Pruebas al 2-3 meses
beta
Liberación Final 9.0/ Comienzo
Junio-Julio 2010
20. Rendimiento
Borrado de JOINS sin sentido
Parche por Robert Haas
Permite remover JOINs redundantes del plan
de consultas para la optimización y mejora
de las mismas
21. Rendimiento
New VACUUM FULL
Parche por Itagaki Takagiro
Reescrito el comando VACUUM FULL
La nueva versión trabaja igual que CLUSTER
USING ctid o reescribiendo en ALTER
TABLE. Éste puede ser más ràpido que
éstos, sobre tdo si tenemos muchas tuplas
muertas y no son interesa el orden físico de
las mismas
22. Lenguajes Procedurales
Bloques de código anónimos (DO)
Parche por Petr Jelinek
Agrega el soporte para bloques anónimos de
código escrito en lenguages procedurales.
23. Lenguajes Procedurales
DO $DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM
information_schema.tables
WHERE table_type = ‘VIEW’ AND table_schema =
‘public’
LOOP
EXECUTE ‘GRANT ALL ON ’ ||
quote_ident(r.table_schema) || ‘.’ ||
quote_ident(r.table_name) || ‘TO webuser’;
END LOOP;
END$$;
24. Lenguajes Procedurales
Mejoras a PL/Python
Parchesde muchos contribuidores
Soporte para Python-3.1
Soporte para bloques anónimos de código
Conversión de tipos de datos mejorada
25. Lenguajes Procedurales
Mejoras a PL/Perl
Parchesde muchos contribuidores
Soporte para contexto de errores
Soporte para bloques anónimos de código
Refactorización hecha sobre plperl.c
Agregadas funciones útiles como quote_literal,
encode_bytea, etc
26. Triggers
Triggers en columnas
Sólo se disparan si ciertas columnas son
modificadas
Ayudan a resolver problemas de TRIGGERS
circulares.
27. Triggers
Triggers condicionales
Lo mejor es un ejemplo:
CREATE TRIGGER test_u
AFTER UPDATE ON test
FOR EACH ROW
WHEN (NEW.i <= 0)
EXECUTE PROCEDURE test_u();
28. Lenguajes Procedurales
EXPLAIN en formatos legibles (XML, JSON,
YAML)
Muy útil para herramientas de monitoreo y
para la visualización gráfica de los planes de
ejecución
Ejemplo:
EXPLAIN (FORMAT XML) SELECT * FROM
pg_class;
29. Administración/Seguridad
GUC´s por usuario, por base de datos
Parches por Álvaro Herrera
Permite el cambio de las GUC´s por defecto
de un modo más complejo y útil
30. Administración/Seguridad
8.4:
ALTER DATABASE <database> SET <guc> TO <value>
ALTER ROLE <role> SET <guc> to <value>
9.0 agrega:
ALTER ROLE <role> IN DATABASE <database>
SET <guc> TO <value>
31. Bibliografía
Blog de Hubert Lubaczewski:
http://www.depesz.com
Sitio Oficial del proyecto:
http://www.postgresql.org
http://planetpostgresql.org
http://www.postgresql-es.org
http://wiki.postgresql.org
32. Bibliografía
Peter Eisentraut: Most Wanted -FOSDEM 2010
Dave Page: Developments in PostgreSQL-9.0 –
FOSDEM 2010
Josh Berkus: PostgreSQL Development TODAY –
FOSDEM 2010
David Fetter: Windowing Functions – PgCon 2009
Robert Treat: PostgreSQL-8.4 Talk – PgCon 2009