Вы находитесь на странице: 1из 47

Introduccin

y Caractersticas Principales de
PostgreSQL
Fernando San Martn Woerner
Universidad Catlica
del Maule
2003
(C) Hernan Lotero

Donde obtener informacin?


En el Sitio oficial www.postgresql.org/docs:
Tutorial (informacin para nuevos usuarios)
Users Guide (sql, tipos de datos, funciones, tuning)
Administrators Guide (Instalacin y mantenimiento)
Programers Guide (extensin de funciones, librerias, diseo)
Reference Manual (sintaxis SQL, programas cliente y servidor)
Developers Guide (Informacin para desarrolladores, PL)

Hispalinux (Espaol)
PostgreSQL: Introduction and Concepts.Bruce Momjian
En el sitio oficial de Chile http://www.postgresql.cl

Antecedentes
La implementacin del DBMS POSTGRES empez en 1996 en la
Universidad de Berkeley en California por el profesor Michael
Stonebraker
PostgreSQL es cdigo abierto descendiente del original Ingres de
Berkeley
La creciente comunidad de usuarios demando gran cantidad de esfuerzo
en soporte y mantenimiento, que debera ser invertido en Investigacin.
Por lo cual Berkeley termin oficialmente el proyecto en 1993.

En 1994 Andrew Yu and Jolly Chen le adicionaron un interprete SQL.


Postgres95 fue lanzado en la Web para que encontrara su propio camino.
Fue escrito en C ANSI y se le realizaron algunas mejoras (funciones
agregadas, group by, libpg, psql, libpgtcl, objetos grandes).
En 1996, Se cambio el nombre a PostgreSQL y se empez a numerar
desde la versin 6.0

Caractersticas
Proporciona soporte a SQL92/SQL99.
POSTGRES fue pionero de muchos de los conceptos objeto-relacional
ahora disponibles en algunos DBMS comerciales.
PostgreSQL ofrece poder adicional incorporando los siguientes conceptos
que representan una manera para que los usuarios extiendan el sistema:
(HERENCIA, TIPOS DE DATOS, FUNCIONES), adems de
(CONSTRAINS, TRIGGERS, RULES, TRANSACTIONS,
NAMESPACE).
Proporciona soporte e interfaces para diversos lenguajes incluyendo C,
C++, Java, Perl, Tcl, PHP and Python.
Estas caractersticas lo califican como Objeto-Relacional (Ultima versin
7.3.4).

Introduccin
Arquitectura del sistema basada en Procesos cooperativos:
Un proceso servidor: Maneja los archivos de base de datos,
acepta conecciones a la base de datos y permite acciones
sobre las B.D. El proceso servidor es llamado postmaster.
Las aplicaciones de usuario final (frontEnd): Desean
realizar operaciones sobre la base de datos. Pueden ser de
diversa natrualeza: Una herramienta de texto o consola, una
aplicacin grfica, una interface Web.

Arquitectura
Servidor
Postm
aster

DATOS

Cliente
APLICA
CION

Iniciando la Base de Datos


Inicio de la DB

$ initdb
Creacin de la base de datos

$ createdb mydb
Eliminacin de la Base de datos

$ dropdb mydb
Accesando la base de datos mediante la consola interactiva de SQL (psql)

$ psql mydb

Iniciando la Base de Datos


Operaciones Matemticas

mydb=> SELECT 2 + 2;
?column?
---------4
(1 row)
Comandos SQL

mydb=> SELECT * from city;


city
| temp_avg |
date
---------------+----------+-----------San Francisco |
48 | 1994-11-27
San Francisco |
50 | 1994-11-29
Hayward
|
45 | 1994-11-29
(3 rows)

Otras caractersticas:Vectores
Uno de los principios del modelo relacional es que los atributos de una
relacin son atmicos Postgres no posee esta restriccin. Postgres permite
que los atributos de una instancia sean definidos como vectores
multidimensionales de longitud fija o variable. Ej:
CREATE TABLE SAL_EMP (
nombre
text,
pago_trimestre int4[],
agenda
text[][]
);
INSERT INTO SAL_EMP
VALUES ('Carol',
'{20000, 25000, 25000, 25000}',
'{{"talk", "consult"}, {"meeting"}}');

Vectores
SELECT SAL_EMP.pago_trimestre[3] FROM SAL_EMP;
+---------------+
|pago_trimestre |
+---------------+
|10000
|
+---------------+
|25000
|
+---------------+
SELECT name
FROM SAL_EMP
WHERE SAL_EMP.pago_trimestre[1] <>
SAL_EMP.pago_trimestre[2];
+------+
|name |
+------+
|Carol |
+------+

Otra caracterstica: Herencia


CREATE TABLE cities (
name
population
altitude

text,
float,
int

-- (in ft)

);
CREATE TABLE capitals (
state
char(2)
) INHERITS (cities);
una instancia de capitals hereda (inherits) todos los atributos (name,
population, altitude) de la clase cities.

Herencia
Por ejemplo, la siguiente consulta encuentra todas las ciudades situadas a una
altitud de 500 pies o ms:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
+----------+----------+
|name
| altitude |
+----------+----------+
|Las Vegas | 2174
|
+----------+----------+
|Mariposa | 1953
|
+----------+----------+

Herencia
SELECT c.name, c.altitude
FROM cities* c
WHERE c.altitude > 500;
+----------+----------+
|name
| altitude |
+----------+----------+
|Las Vegas | 2174
|
+----------+----------+
|Mariposa | 1953
|
+----------+----------+
|Madison
| 845
|
+----------+----------+

Control de Concurrencia
A diferencia de la mayora de otros sistemas de bases de datos
que usan bloqueos para el control de concurrencia, Postgres
mantiene la consistencia de los datos un modelo multiversin.
Mientras se consulta una base de datos, cada transaccin ve
una imagen de los datos (una versin de la base de datos)
como si fuera tiempo atrs, sin tener en cuenta el estado actual
de los datos que hay por debajo. Esto evita que la transaccin
vea datos inconsistentes que pueden ser causados por la
actualizacin de otra transaccin concurrente en la misma fila
de datos, proporcionando aislamiento transaccional para cada
sesin de la base de datos.

Aislamiento transaccional
El estndar ANSI/ISO SQL define cuatro niveles de aislamiento transaccional
en funcin de tres hechos que deben ser tenidos en cuenta entre
transacciones concurrentes. Estos hechos no deseados son:
lecturas "sucias"
Una transaccin lee datos escritos por una transaccin no esperada, no
confirmada (commited).
lecturas no repetibles
Una transaccin vuelve a leer datos que previamente haba ledo y
encuentra que han sido modificados por una transaccin confirmada.
lectura "fantasma"
Una transaccin vuelve a ejecutar una consulta, devolviendo un
conjuto de filas que satisfacen una condicin de bsqueda y encuentra
que otras filas que satisfacen la condicin han sido insertadas por otra
transaccin confirmada.

Aislamiento transaccional
Niveles de aislamiento de Postgres

NIVEL

Lectura
"sucia"
Lectura no confirm. Posible

Lectura no Lectura
repetible
"fantasma"
Posible
Posible

Lectura confirmada No posible


Lectura repetible No posible

Posible
No posible

Posible
Posible

Serializable

No posible

No posible

No posible

Postgres ofrece lectura confirmada y niveles de aislamiento


serializables.

Aislamiento transaccional
NIVEL DE LECTURA CONFIRMADA (read committed)
Lectura confirmada es el nivel de aislamiento por defecto en Postgres.
Cuando una transaccin se ejecuta en este nivel, la consulta slo ve datos
antes de que la consulta comenzara y nunca ve datos "sucios" pero si
cambios en transacciones concurrentes confirmadas durante la ejecucin
de la consulta
Los resultados de la ejecucin de SELECT o INSERT (con una consulta) no
se vern afectados por transacciones concurrentes.

Aislamiento transaccional
NIVEL DE LECTURA CONFIRMADA (READ COMMITTED)
test=> BEGIN WORK;
BEGIN
test=> SELECT COUNT(*) FROM trans_test;
count
------5
(1 row)
test=> -test=> -- someone commits INSERT INTO trans_test
test=> -test=> SELECT COUNT(*) FROM trans_test;
count
------6
(1 row)
test=> COMMIT WORK;
COMMIT

Aislamiento transaccional
NIVEL DE AISLAMIENTO SERIALIZABLE
La serializacin proporciona el nivel ms alto de aislamiento
transaccional. Cuando una transaccin est en el nivel serializable, la
consulta slo ve los datos cursados antes de que la transaccin comience y
nunca ve ni datos sucios ni los cambios de transacciones concurrentes
confirmados durante la ejecucin de la transaccin.
Por lo tanto, este nivel emula la ejecucin de transacciones en serie, como
si las transacciones fueran ejecutadas un detrs de otra, en serie, en lugar
de concurrentemente
una transaccin serializable no puede modificar filas cambiadas por otras
transacciones despus de que la transaccin serializable haya empezado

Aislamiento serializable
test=> BEGIN WORK;
BEGIN
test=> SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE;
SET VARIABLE
test=> SELECT COUNT(*) FROM trans_test;
count
------5
(1 row)
test=> -test=> -- someone commits INSERT INTO trans_test
test=> -test=> SELECT COUNT(*) FROM trans_test;
count
------5
(1 row)
test=> COMMIT WORK;
COMMIT

Bloqueos y Tablas
Postgres ofrece varios modos de bloqueo para controlar el acceso concurrente
a los datos en tablas. Algunos de estos modos de bloqueo los adquiere
Postgres automticamente antes de la ejecucin de una declaracin,
mientras que otros son proporcionados para ser usados por las
aplicaciones. Todos los modos de bloqueo (excepto para
AccessShareLock) adquiridos en un transaccin se mantienen hasta la
duracin de la transaccin.

Existen dos tipos de bloqueos:


Bloqueos a nivel de tabla
Bloqueos a nivel de registro

Bloqueos a Nivel de tabla


AccessShareLock Un modo de bloqueo adquirido automticamente sobre
tablas que estn siendo consultadas. Postgres libera estos bloqueos
despus de que se haya ejecutado una declaracin.
RowShareLock Adquirido por SELECT FOR UPDATE y LOCK TABLE
para declaraciones IN ROW SHARE MODE.
RowExclusiveLock Lo adquieren UPDATE, DELETE, INSERT y LOCK
TABLE para declaraciones IN ROW EXCLUSIVE MODE.
ShareLock Lo adquieren CREATE INDEX y LOCK TABLE para
declaraciones IN SHARE MODE.
ShareRowExclusiveLock Lo toma LOCK TABLE para declaraciones IN
SHARE ROW EXCLUSIVE MODE.
ExclusiveLock Lo toma LOCK TABLE para declaraciones IN EXCLUSIVE
MODE.
AccessExclusiveLock Lo toman ALTER TABLE, DROP TABLE, VACUUM
FULL, por defecto en un LOCK TABLE

Bloqueos a Nivel de Fila


Este tipo de bloqueos se producen cuando campos internos de
una fila son actualizados (o borrados o marcados para ser
actualizados). Postgres no retiene en memoria ninguna
informacin sobre filas modificadas y de este modo no tiene
lmites para el nmero de filas bloqueadas sin incremento de
bloqueo.
Sin embargo, tenga en cuenta que SELECT FOR UPDATE
modificar las filas seleccionadas marcndolas, de tal modo
que se escribirn en el disco.
Los bloqueos a nivel de fila no afecta a los datos consultados.
Estos son usados para bloquear escrituras a la misma fila
nicamente.

Chequeos de consistencia
Ya que las lecturas en Postgres no bloquean los datos, sin tener en cuenta
el nivel de aislamiento de la transaccin, los datos ledos por una
transaccin pueden ser sobreescritos por otra. En otras palabras, si una fila
es devuelta por SELECT esto no significa que esta fila realmente exista en
el momento en que se devolvi (un tiempo despus de que la declaracin
o la transaccin comenzaran, por ejemplo) ni que la fila est protegida de
borrados o actualizaciones por la transaccin concurrente antes de que
sta se lleve a cabo o se pare.
Para asegurarse de la existencia de una fila y protegerla contra
actualizaciones concurrentes, debera usar SELECT FOR UPDATE o
una declaracin de tipo LOCK TABLE ms apropiada. Esto debe tenerse
en cuenta cuando desde otros entornos se estn portando aplicaciones
hacia Postgres utilizando el modo serializable.

Chequos de consistencia
test=> BEGIN WORK;
BEGIN
test=> SELECT *
test-> FROM lock_test
test-> WHERE name = 'James';
id |
name
-----+-------------------------------521 | James
(1 row)
test=>
test=>
test=>
test=>
test->
test->
UPDATE
test=>
COMMIT

-- (AQU SE PUDE METER OTRA TRANSACCION)


-- the SELECTed row is not locked
-UPDATE lock_test
SET name = 'Jim'
WHERE name = 'James';
1
COMMIT WORK;

Chequos de consistencia
test=> BEGIN WORK;
BEGIN
test=> SELECT *
test-> FROM lock_test
test-> WHERE name = 'James FOR UPDATE;
id |
name
-----+-------------------------------521 | James
(1 row)
test=>
test=>
test=>
test=>
test->
test->
UPDATE
test=>
COMMIT

-- (NO SE PUDE METER OTRA TRANSACCION)


-- the SELECTed row is locked
-UPDATE lock_test
SET name = 'Jim'
WHERE name = 'James';
1
COMMIT WORK;

Catalogo Principal
Nombre del Catalogo
pg_database
pg_class
pg_attribute
pg_index
pg_proc
pg_type
pg_operator
pg_aggregate
pg_am
pg_amop
pg_amproc
pg_opclass

Descripcion
base de datos
clases
atributos de clases
indices secundarios
procedimientos (ambos C y SQL)
tipos (ambos base y complejo)
operadores
conjunto y conjunto de funciones
metodo de acceso
operador de metodo de acceso
soporte de operador de metodo de acceso
operador de clases de metodo de acceso

Extendiendo SQL: Funciones


Es posible extender el sistema mediante la creacin de funciones.
PostgresSQL proporciona tres tipos de funciones:
Funciones de lenguaje de consultas (funciones escritas en SQL)
Funciones de lenguaje procedural (funciones escritas en, por ejemplo,
PLTCL o PLSQL)
Funciones de lenguaje de programacin (funciones escritas en un
lenguaje de programacin compilado tales como C).
Cada clase de funcin puede tomar un tipo base, un tipo compuesto o alguna
combinacin como argumentos (parmetros). Adems, cada clase de
funcin puede devolver un tipo base o un tipo compuesto

Funciones del Lenguaje SQL


Para ilustrar una funcin SQL sencilla, considere lo siguiente, que se podra
usar para cargar en una cuenta bancaria:
create function TP1 (int4, float8) returns int4
as 'update BANK set balance = BANK.balance + $2
where BANK.acctountno = $1
select(x = 1)'
language 'sql';
Un usuario podra ejecutar esta funcin para cargar $100.00 en la cuenta 17
de la siguiente forma:
select (x = TP1( 17,100.0));

Funciones del Lenguaje SQL


Funciones SQL sobre tipos base: La funcin SQL ms simple posible no
tiene argumentos y sencillamente devuelve un tipo base, tal como int4:
CREATE FUNCTION one() RETURNS int4
AS 'SELECT 1 as RESULT' LANGUAGE 'sql';
SELECT one() AS answer;
+-------+
|answer |
+-------+
|1
|
+-------+

Funciones del Lenguaje SQL


En este ejemplo, note cmo nos referimos a los argumentos dentro de la
funcin como $1 y $2:
CREATE FUNCTION add_em(int4, int4) RETURNS int4
AS 'SELECT $1 + $2;' LANGUAGE 'sql';
SELECT add_em(1, 2) AS answer;
+-------+
|answer |
+-------+
|3
|
+-------+

Funciones del Lenguaje


Procedural
PL/pgSQL: Es un lenguaje procedural cargable para el sistema de bases de
datos Postgres.Este paquete fue escrito originalmente por Jan Wieck con
los siguientes objetivos:
Pueda usarse para crear funciones y procedimientos disparados por
eventos,
Aada estructuras de control al lenguaje SQL,
Pueda realizar clculos complejos,
Herede todos los tipos definidos por el usuario, las funciones y los
operadores,
Pueda ser definido para ser fiable para el servidor,
Sea fcil de usar

Estructura del PL-pgSQL


PL/pgSQL es un lenguaje orientado a bloques. Un bloque se define como:
[<<label>>]
[DECLARE
declarations]
BEGIN
statements
END;

Estructura del PL-pgSQL


Ejemplo:
CREATE FUNCTION logfunc2 (text) RETURNS datetime AS '
DECLARE
logtxt ALIAS FOR $1;
curtime datetime;
BEGIN
curtime := ''now'';
INSERT INTO logtable VALUES (logtxt, curtime);
RETURN curtime;
END;
' LANGUAGE 'plpgsql';

Funciones Internas
Las funciones escritas en C se pueden compilar en objetos que se pueden
cargar de forma dinmica, y usar para implementar funciones SQL
definidas por el usuario. Suponga que funcs.c es as:
#include <string.h>
#include "postgres.h"
int add_one(int arg)
{
return(arg + 1);
}
Podriamos escribir:
CREATE FUNCTION add_one(int4) RETURNS int4
AS 'PGROOT/tutorial/funcs.so' LANGUAGE 'c';

Triggers
Si un evento trigger ocurre, el administrador de triggers (llamado Ejecutor)
inicializa la estructura global TriggerData *CurrentTriggerData y llama a
la funcin trigger para procesar el evento.
La funcin trigger debe ser creada antes que el trigger, y debe hacerse como
una funcin sin argumentos, y cdigos de retorno opacos.
La sintaxis para la creacin de triggers es la siguiente:
CREATE TRIGGER <trigger name> <BEFORE|AFTER>
<INSERT|DELETE|UPDATE>
ON <relation name> FOR EACH <ROW|STATEMENT>
EXECUTE PROCEDURE <procedure name> (<function
args>);

EJEMPLO DE UN TRIGGER:
CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS
BEGIN
-- Check that empname and salary are given
IF NEW.empname ISNULL THEN
RAISE EXCEPTION ''empname cannot be NULL value'';
END IF;
IF NEW.salary ISNULL THEN
RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
END IF;
-- Who works for us when she must pay for?
IF NEW.salary < 0 THEN
RAISE EXCEPTION ''% cannot have a negative salary'',NEW.empname;
END IF;
-- Remember who changed the payroll when
NEW.last_date := ''now'';
NEW.last_user := getpgusername();
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Interfaces de Programacin
Librerias para C(libpq y ECPG), C++, TCL, Perl(DBDBI-Pg), Python(PyGreSQL), JDBC, ODBC, PHP en
los mismos paquetes de la distro.
Desde el otro lado podemos acceder usando ODBC y
tecnologas como ADO o DAO.
Desde el mundo Unix tenemos mltiples lenguajes en
los cuales podemos usar SQL incrustado.

Interfaces de Programacin
Ejemplo en Python:
from pg import *
cnx = connect('mydb','127.0.0.1',5432,None,None,
'usuario', 'password')
r = cnx.query(select * from mytable).getresult()
for i in r:
print i

Interfaces de Programacin
(Dark Side...)
Ejemplo desde VB usando ADO:
dim cnx As New ADODB.Connection
dim r As New ADODB.Recorset
cnx.Open "DSN=coneccion;UID=usuario;PWD=passwd;"
r.open select * from mytable, cnx
while not r.eof
print r!micampo
r.movenext
wend

r.close

Mejorando el Desempeo
Existen diversas formas de mejorar el desempeo de la Base de datos. Entre
ellas podemos destacar:

Indexes
Unique Indexes
CLUSTER
VACUUM
VACUUM ANALYZE
EXPLAIN

Indices
Internamente Postgres almacena los datos en archivos del sistema operativo.
Cada tabla tiene su propio archivo.
Un indice es un archivo separado ordenado por una o ms columnas.
Contiene apuntadores al archivo de datos permitiento rapido acceso a la
tabla.
Use indices sobre las columnas que aparecen en el Where y order by.
Puede crear tantos indices como deseee, pero recuerde que tienen un costo
de espacio en disco.
Ejemplo de creacin de un indice simple:
CREATE INDEX customer_custid_idx ON customer (customer_id);

Ejemplo de creacin de un indice compuesto:


CREATE INDEX customer_custid_idx ON customer (age , size);

CLUSTER
El comando cluster reordena fisicamente una tabla para que coincida con el
orden del indice
Este comando es de gran valor cuando el desempeo es critico y cuando
existen muchos valores ducplicados.
Sintaxis:

CLUSTER indexname ON table

La tabla es realmente copiada a una tabla temporal en el orden indicado, luego


renombra la nueva con el nombre de la original. Por esta razon, todos los
persisos sobre la tabla se pierden.

VACUUM
Cuando Postgres actualiza un registro, mantiene una copia del original y
agrega uno nuevo. El registro original es marcado como borrados. De
manera similar los registros eliminados con marcados como borrados.
El comando VACUUM remueve los registros marcados como borrados del
archivo.
Se deberia correr VACCUM con cierta frecuencia sobre tablas que tienen
gran movimiento.
Puede correr el comando sobre una tabla o sobre toda la Base de datos
VACUUM
VACUUM tablename
VACUUM ANALYZE

(Toda la base de datos)


(Una tabla)
(Almacena adems inf. Estadstica de duplicados)

EXPLAIN
Causa que postgres muestre como va a ejecutar un comando (plan de ejecucin)
test=> EXPLAIN SELECT customer_id FROM customer;
NOTICE: QUERY PLAN:
Seq Scan on customer (cost=0.00..15.00 rows=1000 width=4)
EXPLAIN
test=> CREATE UNIQUE INDEX custid_idx ON customer (customer_id);
CREATE
test=> EXPLAIN SELECT customer_id FROM customer WHERE customer_id =
55;
NOTICE: QUERY PLAN:
Index Scan using customer_custid_idx on customer (cost=0.00..2.01
rows=1 width=4)

Preguntas

Вам также может понравиться