Clasificaciones, modalidades y tendencias de investigación educativa.
Curso de PostgreSQL
1. Curso de PostgreSQL DBA
2010
informes@eqsoft.net
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 1/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
2. ●Día 1: Instalación y Configuración
●Día 2: Objetos de la DB y Accesos
●Día 3: SQL y Tipos de datos especiales
●Día 4: Transacciones, Functions, Triggers y Rules
●Día 5: Mantenimiento y análisis de querys
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 2/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
3. Instalación y Configuración
1. Instalación:
3 forma de instalación son las más comunes:
● Instalación vía paquetes instaladores (deb ó rpm)
● Ventajas: mantenimiento prácticamente 0
● Desventajas: ramas congeladas o sin actualizar por mucho tiempo
● Compilación desde el código fuente (descargado o por Ports/Portage)
● Ventajas: Rápida ejecución, menos recursos, uso de última versión,
posibilidad de añadir nuevas funcionalidades extendidas.
● Desventajas: Mantenimiento manual, no es sencillo actualizar(salvo en
ports/portage)
● Paquetes no oficiales de instalación binarios
● Ventajas: Instalación de una versión específica
● Desventajas: Imposible de mantener
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 3/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
4. Instalación y Configuración
1. Instalación:
Instalación vía paquetes instaladores (deb ó rpm)
● Consideraciones : mantener siempre actualiza mientras no se mueva entre
ramas.
● Compilación desde el código fuente (descargado o por Ports/Portage)
● Consideraciones : no instalar en sistemas que usan administradores de
paquetes.
● Paquetes no oficiales de instalación binarios
● Consideraciones: usar solo en casos en que se requiera una versión
especifica, recomendable siempre tener una copia de la versión de
producción para casos de desastres.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 4/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
5. Instalación y Configuración
1.Instalación
Requerimientos de hardware:
● Procesador : si planea ejecutar Querys muy complejos es recomendable
utilizar plataformas de 64bits.
● Memoria : mientras más ram se pueda tener es mejor, especialmente si se
van a ejecutar Querys que van a mover mucha data, mientras mayor capacidad
tenga el cache mejor será el rendimiento de las consultas.
● Disco : la cantidad de espacio dependerá del volumen de datos,
recomendaciones:
● SCSI, para bases de datos relativamente medianas pero donde se requiere
un alto acceso a los datos, entorno muy propenso a caídas de servidor.
● SATA, para bases de datos muy grandes pero con no muy altos
requerimientos de acceso a los mismos, usar sistemas de archivos con
Journaling (ext4 por ejemplo) para minimizar riesgos en entornos
propensos a caídas.
● SSD, para cache de la DB, no usar para almacenamiento de datos “real”
debido a su “fragilidad” en entornos propensos a caídas.
● Arreglo de discos, entornos muy grandes de datos con mucho acceso a los
mismos.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 5/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
6. Instalación y Configuración
1.Instalación
¿Que Linux usar? :
● Enterprise Edition
● Ventajas: muy seguros, actualizaciones centradas principalmente en la
seguridad.
● Desventajas: versiones antiguas incluso al momento de su lanzamiento.
CentOS, Ubuntu Server, RedHat, Suse
● Desktop Edition
● Ventajas: actualizaciones constantes, se encuentran versiones más
recientes.
● Desventajas: no siempre bien probadas, principalmente se enfocan en
soltar la versión más reciente posible., mayor sensibilidad a problemas
de seguridad.
Ubuntu, Fedora, Suse
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 6/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
7. Instalación y Configuración
1. Instalación
¿Unixs Libres? :
● FreeBSD es una excelente opción, gestiona muy bien múltiples conexiones y
libera los procesos rápidamente, consumo de recursos increíblemente bajo,
soporte comunitario más amplio de todos los BSDs (OpenBSd ó NetBSD).
● OpenSolaris evaluar con cuidado, ¿seguirá siendo libre?, poco soporte
comunitarios, se sabe que ZFS es un sistema de archivos excelente para
PostgreSQL, se conocen experiencias de muchos procesadores virtualizados
con PostgreSQL.
● ¿Solaris y AIX?, buenas plataformas, evaluar bien los costos, seguramente
solo se encontrarán versiones antiguas de PostgreSQL disponibles para
estas plataformas o se requerirán versiones especificas de muchas
librerías dependencias.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 7/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
8. Instalación y Configuración
Instalando......
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 8/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
9. Instalación y Configuración
1. Instalación:
● La mayoría de las distribuciones actuales generan los directorios
necesarios para correr el cluster de la DB, el caso de Ubuntu:
● /etc/postgresql <-- archivos de configuración, separados por
versión principalmente pg_hba.conf y
postgresql.conf.
● /usr/lib/postgresql <-- binarios y librerías, separados por versiones,
separados por versión.
● /var/lib/postgresql <-- data de la DB, separados por versión.
● El usuario administrador más común creado por los instaladores es
“postgres”, alternativamente es “pgsql” (en otras distribuciones).
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 9/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
10. Instalación y Configuración
1. Instalación:
● Dentro de /var/lib/postgresql/x.y/main (reemplazar x.y con la versión de
su PostgreSQL) encontrará los directorios de trabajo de la base de datos:
● Base <-- directorio de data
● global <-- directorio de data global del sistema
● pg_clog <-- directorio de resultado de transacciones
● pg_multixact <-- locks
● pg_stat_tmp <-- archivos temporales de las estadísticas de las dbs
● pg_subtrans <-- usado en control de transacciones
● pg_tblspc <-- enlaces simbólicos a los tablespaces
● pg_twophase <-- usado en control de transacciones
● pg_xlog <-- directorio de WAL (historia de movimientos de data, es
la que asegura que la dbms sea ACID)
2 archivos adicionales:
● postmaster.opts <-- comando con el que se ejecuto el servicio de la dbms
● postmaster.pid <-- “pid” del proceso del sistema, en raras ocasiones la
dbms se bloquea al reiniciar el servicio porque no
se elimina este archivo, se puede borrar
manualmente pero jamas mientras el servicio este
iniciado.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 10/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
11. Instalación y Configuración
2. Asegurando el sistema.
Por defecto PostgreSQL viene configurado para dar accesos en “localhost”,
los usuarios comunes de administración son “postgres” y “pgsql”.
Vamos a crear un nuevo “Super Usuario” desde consola:
usuario@host: sudo su – postgres <-- ingrese su password
postgres@host: createuser admindb <-- admindb es el usuario a
crear
¿Será el nuevo rol un superusuario? (s/n) <-- tendrá el mismo nivel del
usuario “postgres” tiene
permisos especiales a los
catálogos de objetos del
Sistema.
postgres@host: psql template1 <-- ingresamos para cambiar el
Password de “admindb”
template1=# alter user admindb password 'dbadmin'; <-- asignamos el nuevo
template1=# alter user postgres password 'dbpgsql'; Password.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 11/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
12. Instalación y Configuración
2. Asegurando el sistema
Ahora necesitamos que no cualquier persona con acceso físico al “servidor”
pueda ingresar a la base de datos, para ello editamos el archivo
“pg_hba.conf”.
usuario@host: sudo nano /etc/postgresql/8.4/main/pg_hba.conf <-- reemplace 8.4 por su
DICE: versión instalada
# Database administrative login by UNIX sockets
local all postgres ident
# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 md5
DEBE DECIR:
# Database administrative login by UNIX sockets
#local all postgres ident
# "local" is for Unix domain socket connections only
local all all password <-- obligamos a que todo usuario
# IPv4 local connections: conecte localmente escriba
host all all 127.0.0.1/32 password su password
# IPv6 local connections:
#host all all ::1/128 md5 <-- usamos esto solo si tenemos
protocolo Ipv6.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 12/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
13. Instalación y Configuración
2. Asegurando el sistema
Reiniciamos el sistema
usuario@host: sudo /etc/init.d/postgresql-X.Y restart <-- X.Y la versión
Instalada.
Porque hicimos esto:
a) Hemos creado un password para el usuario administrador superior
“postgres”.
b) Trabajaremos con un usuario alterno para mayor seguridad.
c) Evitamos que cualquier persona con acceso al servidor entre a la base de
datos si conocer los passwords.
Debilidad:
pg_hba.conf, si lo pueden editar nos desasen la seguridad.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 13/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
14. Instalación y Configuración
3. Archivo de configuración pg_hba.conf
“pg_hba.conf” nos permite definir (en orden de aplicación):
a)Conecciones locales (x socket) ó de host seguras o inseguras (x TCP/IP)
b)Base datos a la que nos podemos conectar
c)Usuarios que se pueden conectar a las DBs
d)Direcciones autorizadas para conectarse (solo en caso TCP/IP)
e)Tipo de autenticación
# Database administrative login by UNIX sockets
local all postgres ident
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 md5
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 14/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
15. Instalación y Configuración
3. Archivo de configuración pg_hba.conf
a)Conecciones locales (x socket) ó de host seguras o inseguras (x TCP/IP)
Posbles valores:
Local <-- conexiones por socket, más rápidas, solo si la aplicación
que hará uso de la db esta en el mismo servidor
Host <-- lo normal, conexiones vendrán por la red, puede o no tener
Soporte SSL
Hostssl <-- solo conexión SSL
Hostnossl <-- solo sin SSL
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 15/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
16. Instalación y Configuración
Configuración básica:
2. Archivo de configuración pg_hba.conf
b)Base datos a la que nos podemos conectar
Se pueden definir conexiones para todas las db usando “ALL” o una
específica mencionándola directamente.
Recomendación: no usen combinaciones de mayúsculas y minúsculas.
Se puede usar sameuser, samegroup, samerol para indicar que la base de
datos a la que me conecto es la misma que mi nombre de usuario, grupo ó
rol.
c)Usuarios que se pueden conectar a las Dbs
Podemos especificar restricciones para todos los usuarios usando “ALL” o
para uno específico escribiendo su nombre, si pones “+” por detras es el
nombre de un grupo.
En b) y c) podemos poner varias db y usuarios separados por comas.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 16/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
17. Instalación y Configuración
3. Archivo de configuración pg_hba.conf
d)Direcciones autorizadas para conectarse (solo en caso TCP/IP)
Podemos especificar IPs directamente o por rango
192.168.1.10/32 <-- solo la IP mencionada
192.168.1.0/24 <-- todo el segmento 192.168.1.x
192.168.0.0/16 <-- todo el segmento 192.168.x.x
192.0.0.0/8 <-- todo el segmento 192.x.x.x
0.0.0.0/0 <-- todo el mundo
También podemos especificar IP y netmask (poco usado).
Se puede especificar IP de diferentes redes (no todo debe estar en
192.x.x.x).
Esto solamente se utiliza en el escenario donde el primer parametro es
HOST, HOSTSSL ó HOSTNOSSL.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 17/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
18. Instalación y Configuración
3. Archivo de configuración pg_hba.conf
e)Tipo de autenticación
PostgreSQL provee diferentes tipos de autenticación, los mas comunes:
Trust <-- permite que se pueda ingresar a la DB sin password
Reject <-- cierra el acceso a una DB o a las direcciones especificadas
Password <-- requiere que se especifique el password del usuario
Ident <-- el usuario a usar debe ser del sistema operativo y debe a la
vez ser usuario de la db, usada en conexiones locales
Ldap <-- para autentificaciones contra un servicio como OpenLdap
Md5, gss, sspi, krb5, radius, cert, pam son de menos uso y requieren
configuraciones de otros servicios (como Ldap).
Cualquier cambio en este archivo requiere reiniciar el servicio del
PostgreSQL.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 18/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
19. Instalación y Configuración
4. Archivo de configuración postgresql.conf
El archivo “postgresql.conf” contiene los parametros de configuración del
rendimiento y funcionalidad del dbms, algunos parámetros principales:
listen_addresses = 'localhost' <-- permite especificar si las conexiones a
la db son locales o de red (poner “*”).
Port = 5432 <-- es el puerto TCP que va a escuchar el
Dbms para aceptar conexiones, es posible
Tener diferentes instalaciones en el
Mismo servidor pero especificando
Diferetnes puertos.
max_connections = 100 <-- máximo de conexiones simultaneas que
aceptará el servidor.
shared_buffers = 24MB <-- indica la cantidad de RAM que usa el
Dbms para trabajar las consultas, no
puede ser mayor a el valor guardado en
/proc/sys/kernel/shmmax
Modificar /etc/sysctl.conf añadiendo
kernel.shmmax=[nuevo_valor_en_#entero]
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 19/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
20. Instalación y Configuración
4. Archivo de configuración postgresql.conf
El archivo “postgresql.conf” contiene los parametros de configuración del
rendimiento y funcionalidad del dbms, algunos parámetros principales:
log_destination = 'stderr' <-- permite generar el log de la dbms.
Stderr, manda el log a donde se especifique
Syslog, manda el log a /var/log/messages
log_connections = off <-- permite loggear las conexiones que recibe la
Dbms, ayuda mucho a depurar el pg_hba.conf
log_statement = 'none' <-- permite loggear los querys que procesa la
Dbms.
none, no loggea querys
all, loggea todos los querys, bien o mal
procesados
ddl, loggea los comandos que modifican
Estructuras en la db
mod, loggea los mismos comandos que ddl más
Comandos de movimiento de data
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 20/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
21. Instalación y Configuración
4. Archivo de configuración postgresql.conf
El archivo “postgresql.conf” contiene los parametros de configuración del
rendimiento y funcionalidad del dbms, algunos parámetros principales:
autovacuum = on <-- activa la “limpieza” de páginas no-activas
en el directorio donde se almacena la data,
tomar en cuenta que este es un “lazy vacuum”
no un “full vacuum” y que los valores de
presición del vacuum no deben generar
congestión en la base de datos.
lc_messages = 'es_PE.utf8' <-- determina el tipo de “locale” para el
almacenamiento de la data
(internacionalización), por defecto se usa
el mismo del sistema operativo,
recomendación no modificarlo.
Cualquier cambio en este archivo requiere reiniciar el servicio del
PostgreSQL.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 21/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
22. Instalación y Configuración
Archivo de configuración pg_hba.conf y postgresql.conf
Practica
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 22/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
23. Instalación y Configuración
5. Instalando PhpPgAdmin y PgAdmin3
PhpPgAdmin http://phppgadmin.sourceforge.net/
Aplicación Web que nos permite administrar la base de datos, contiene toda
la funcionalidad necesaria para un DBA.
Puede instalarse de “fuentes” o del repositorio de su distribución de Linux
(versiones más antiguas que la última estable).
Archivo de configuración “conf/config.inc.php”.
$conf['servers'][0]['host'] = ''; <-- host ó IP de la dbms
$conf['servers'][0]['port'] = 5432; <-- puerto para conexiones Tcp/Ip
$conf['extra_login_security'] = true; <-- indispensable para que no
Ingrese alguien a la dbms con los
Usuarios clásicos.
$conf['owned_only'] = true; <-- para ver solo los objetos de los
Cuales eres propietario
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 23/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
24. Instalación y Configuración
5. Instalando PhpPgAdmin y PgAdmin3
PgAdmin3 http://www.pgadmin.org/
Aplicativo GUI que permite una administración y depuración de los objetos
de una dbms PostgreSQL.
Instalar de preferencia desde los repositorios de su distribución de Linux.
Una de las funcionalidades más importantes es el Debugger para funciones,
pero requiere que se compile desde código fuente un “contrib” adicional
para la base de datos.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 24/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
25. Instalación y Configuración
5. Instalando PhpPgAdmin y PgAdmin3
Practica
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 25/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
26. Instalación y Configuración
5. Afinando Postgresql
PostgreSQL no requiere demasiado trabajo de afinamiento, básicamente
concentra toda la labor de esto en los parámetros de postgresql.conf
Los valores que tiene postgresql.conf están pensados para trabajar en una
configuración de hardware mínima.
a)como calcular el valor de SHARED_BUFFERS
Shared_buffers nos dice cuanta memoria va a consumir la dbms, se recomeinda que sea al
menos 10% a 25% de la ram disponible en el sistema y hasta un 40%, el valor nunca
puede ser jamas al informado en “/proc/sys/kernel/shmmax”.
Para medir el valor correcto debemos contar cuantas “páginas” caben en la cantidad de
ram asignada en shared_buffers, una página generalmente mide 8kb, por ejemplo si
tenemos 4gb de ram asignaremos 400mb (400mb no es exacto el 10%):
En postgresql.conf ponemos:
shared_buffers=400mb
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 26/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
27. Instalación y Configuración
5. Afinando Postgresql
a)como calcular el valor de SHARED_BUFFERS
Calculamos el valor en shmmax:
400mb x 1024kb = 409600 <-- cantidad de kb a utilizar por el buffer
409600 / 8 = 51200 <-- cantidad de páginas a utilizar por el buffer
51200 x 8192b = 419430400 <-- cantidad mínima de ram en bytes que se debe configurar
Debe considerarse que hay otras aplicaciones que hacen
Uso de esta cantidad de ram asignada.
Abrimos el archivo “/etc/sysctl.conf” y añadimos:
kernel.shmmax = 421527552 <-- añadimos un par de megas más para asegurarnos que no
Nos faltará ram.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 27/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
28. Instalación y Configuración
5. Afinando Postgresql
b)como calcular el valor de WORK_MEM
work_mem es el espacio de memoria que se usará para los ordenamientos de los datos
cuando se ejecutan consultas, no existe una formula exacta de cálculo dependerá de que
tanta data se mueva en las consultas que ejecutamos y cual es la concurrencia de
ejecución de las consultas.
La regla dice, si las consultas se ejecutan con poca concurrencia entonces asignar
entre 2% a 4% de la ram disponible será ideal, pero si la concurrencia es alta
entonces debe asignarse menos memoria debido a que cada consulta consume la misma
cantidad de ram.
work_men = 163MB <-- 4% de 4gb (redondeado)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 28/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
29. Instalación y Configuración
5. Afinando Postgresql
c)temp_buffers
Es la cantidad de memoria que tendrá asignada cada conexión al dbms para manejo de
tablas temporales, esta no se libera hasta que la sesión muera, cada sesión podría
manejar un tamaño difereten y mayor al de default (8mb) pero solo hasta antes de
generar la primera tabla temporal.
d)max_locks_per_transaction
Permite indicar cuantos objetos se pueden bloquear en una transacción, un registro no
se considera un objeto, el default es 64 solo valdría la pena subirlo si es que
tenemos transacciones que bloquean muchos más objetos únicos (tablas) que este valor,
obviamente el consumo de memoria crecerá.
e)max_connections
Determina cuantas conexiones soportará el dbms, subirlo significará un consumo de
recursos adicional en el OS (sistema operativo), y en realidad no servirá de mucho si
es que el OS no soporta esta carga de trabajo.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 29/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
30. Instalación y Configuración
Configuración básica:
5. Afinando Postgresql
f)random_page_cost
Determina en que momento se van a utilizar índices ó búsquedas
secuenciales, el valor por defecto es 4, se recomienda aumentarlo para
discos lentos y bajarlo para discos rápidos.
Considere que los índices son efectivos si la variedad de datos es alta, si
es baja entonces es probable que aunque se mueva la configuración se
ejecuten búsquedas secuenciales.
g)effective_cache_size
Setea el tamaño de cache en RAM que se usará en una consulta, el valor por defecto es
128Mb, un valor alto facilitará el uso de índices, un valor bajo hará que se prefiera
el uso de búsquedas secuenciales, se recomienda como máximo 50% del total de la RAM.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 30/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
31. Instalación y Configuración
Configuración básica:
5. Afinando Postgresql
h)statement_timeout
Configura cuanto tiempo puede demorar un query en ejecutarse, evita que se lancen
querys extremadamente pesados que demoren mucho tiempo en ejecutarse, por defecto es 0
(desactivado) pero se expresa en milisegundos, OjO configurarlo afectará todos los
querys.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 31/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
32. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
PostgreSQL permite crear objetos comunes de uan base de datos tales como:
●Base datos
●Tablas
●Vistas
●Schemas
●Usuarios
●Grupos
●Roles
●Funciones (que sería un simil a store procedures)
●Triggers
●Rules
● Etc, etc.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 32/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
33. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
a) Base datos
● Si puede hacer por consola del OS usando “createdb” o desde consola de
PostgreSQL (psql) usando “create database”.
● Podemos especificar quien será el owner de la db, si no se especifica por
defecto el owner es el usuario que la esta creando.
● Desde la versión 8.3 PostgreSQL se une fuertemente con el Locate del OS,
si no se especifica el encoding o el locate se asumirá el del OS
● La db asume la estructura de una db “template”, esta es por defecto la db
“template1”, podemos usar cualquier db como template siempre y cuando no
exista ningún usuario logeado en ella, se recomienda no cambiar la
estructura de template1, solo se copia estructura y no data.
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace ]
[ CONNECTION LIMIT [=] connlimit ] ]
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 33/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
34. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
a) Base datos
Teóricamente no hay problemas de recibir data en Latin1 en una db UTF8, solo es
necesario hacer esto:
ALTER DATABASE base_de_datos SET client_encoding TO 'latin1';
Para cambiar el encoding de toda la db:
update pg_database set encoding=8 where datname=’base_de_datos’;
Para ver la tabla de códigos completa: http://www.lscvsystems.com/blog/?p=32
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 34/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
35. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
b) Tablas
Crear una tabla de un Type nos ayuda a tener estructuras pre-construidas para los
datos.
prueba4=# create type tpy_usuario as (id integer, password char(25), nombre
varchar(100));
prueba4=# create table tbl_usuario of tpy_usuario;
prueba4=# select * from tbl_usuario;
id | password | nombre
++
(0 rows)
prueba4=# drop type tpy_usuario cascade;
NOTICE: drop cascades to table tbl_usuario
DROP TYPE
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 35/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
36. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
b) Tablas
Un campo de la tabla puede tener la estructura de un Type.
prueba4=# create table tbl_usuario2 ( id serial, datos_unicos tpy_usuario);
prueba4=# insert into tbl_usuario2 values (1,(1,'password','nombre'));
prueba4=# insert into tbl_usuario2 (datos_unicos.id, datos_unicos.password,
datos_unicos.nombre) values (2, 'password2', 'nombre2');
prueba4=# select * from tbl_usuario2;
id | datos_unicos
+
1 | (1,"password ",nombre)
1 | (2,"password2 ",nombre2)
prueba4=# select (datos_unicos).password from tbl_usuario2;
password
password
password2
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 36/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
37. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
b) Tablas
Un campo de la tabla puede tener la estructura de un Type.
Borrar el type hará que se pierdan todas los campos creados a partir de este en todas
las tablas donde se haya usado.
prueba4=# drop type tpy_usuario cascade;
NOTICE: drop cascades to 2 other objects
DETAIL: drop cascades to table tbl_usuario
drop cascades to table tbl_usuario2 column datos_unicos
DROP TYPE
prueba4=# select * from tbl_usuario2;
id
1
1
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 37/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
38. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
b) Tablas
INHERITS nos permite heredar a la estructura de nuestra nueva tabla la estructura de
otra tabla.
prueba4=# create table tbl_padre (id integer, nombre varchar(100));
prueba4=# create table tbl_hijo (direccion varchar(200)) INHERITS (tbl_padre);
CREATE TABLE
prueba4=# select * from tbl_hijo;
id | nombre | direccion
++
(0 rows)
prueba4=# drop table tbl_padre cascade;
NOTICE: drop cascades to table tbl_hijo
DROP TABLE
LIKE genera el mismo efecto pero al borrar la tabla padre no se pierde la estructura.
prueba4=# create table tbl_hijo2 (like tbl_padre);
prueba4=# create table tbl_hijo3 (like tbl_padre, casa varchar(300));
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 38/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
39. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
c) Vistas
Una interesante funcionalidad extendida es la posibilidad de tener vistas “updatable”,
es soportado solo insert y update.
prueba4=# create table tbl_vista ( id integer, nombre varchar(100));
prueba4=# crea view vw_vista as select * from tbl_vista;
prueba4=# create rule rul_vista as on insert to vw_vista do instead insert into
tbl_vista (id,nombre) values (new.id, new.nombre);
prueba4=# insert into vw_vista (id,nombre) values (1,'ernesto');
prueba4=# select * from tbl_vista;
id | nombre
----+---------
1 | ernesto
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 39/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
40. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
d) Schemas
Los esquemas son contenedores de objetos dentro de una db, por default
trabajamos en el schema PUBLIC.
La principal utilidad puede estar en la administración de permisos a los
objetos de la db ó simplemente la organización.
prueba4=# create schema public2;
prueba4=# create table public2.tbl_prueba(id integer);
prueba4=# create table public.tbl_prueba(id integer);
prueba4=# insert into tbl_prueba values(1);
prueba4=# insert into public2.tbl_prueba(2);
prueba4=# select * from public.tbl_prueba;
id
----
1
prueba4=# select * from public2.tbl_prueba;
id
----
2
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 40/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
41. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
e) Domain
Los domains nos dejan crear tipos de datos validados, si lo eliminamos
eliminamos todos los campos de todas las tablas que lo han usado.
prueba3=# create domain dmn_adulto as integer check (value > 18 and value < 60);
prueba3=# create table tbl_persona(id int, edad dmn_adulto);
prueba3=# insert into persona values (1,25);
INSERT 0 1
prueba3=# insert into persona values (1,5);
ERROR: value for domain dmn_adulto violates check constraint "dmn_adulto_check"
prueba3=# drop domain dmn_adulto cascade;
NOTICE: drop cascades to table persona column edad
DROP DOMAIN
prueba3=# select * from persona;
id
----
1
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 41/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
42. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
f) Sequence
Una funcionalidad interesante puede ser aplicable en entornos donde se
producen muchas “insersiones” de data, y es mantener una cantidad de
números en memoria para un acceso más rápido a los contadores.
prueba4=# create sequence contador cache 100; <-- reserva 100 números en
Cache
Cycle permite reiniciar el contador con el mínimo valor especificado cuando
este llega a su máximo valor declarado.
prueba4=# create sequence cmin_max cycle minvalue 1 maxvalue 3;
Increment permite definir cada cuantas unidades aumentará el contador,
positivo ó negativo.
prueba4=# create sequence salto increment -10;
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 42/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
43. Objetos de la DB y Accesos
1. Objetos convencionales en la DB
Practica
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 43/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
44. Objetos de la DB y Accesos
2. Accesos
a) Los roles
Un rol es básicamente lo mismo que un usuario ó un grupo, no existe diferencia
fundamental entre ambos, principalmente al crear un usuario tiene más permisos
asignados que cuando uno crea un rol donde todo esta desactivado por defecto.
CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option can be:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| CREATEUSER | NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'timestamp'
| IN ROLE rolename [, ...]
| IN GROUP rolename [, ...]
| ROLE rolename [, ...]
| ADMIN rolename [, ...]
| USER rolename [, ...]
| SYSID uid
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 44/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
45. Objetos de la DB y Accesos
2. Accesos
b) Los permisos
Por defecto uno tiene permisos totales sobre los objetos que haya creado
con su propio rol, ningún rol puede acceder a un objeto creado por otro
rol.
Se usan 2 comandos principales para asignación de permisos Grant (autoriza)
y Revoke (desautoriza).
prueba4=# create role usr1 password 'prueba';
prueba4=# create role usr2 password 'prueba';
Como usr1
prueba4=> create table tbl_prueba ( id integer);
Como usr2
prueba4=> select * from tbl_prueba;
ERROR: permission denied for relation tbl_prueba
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 45/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
46. Objetos de la DB y Accesos
2. Accesos
b) Los permisos - GRANT
●GRANT ON TABLE
●GRANT ( column ) ON TABLE
●GRANT ON SEQUENCE
●GRANT ON DATABASE
●GRANT ON FOREIGN DATA WRAPPER <-- para conexiones Dlink
●GRANT ON FOREIGN SERVER <-- para conexiones Dlink
●GRANT ON FUNCTION
●GRANT ON LANGUAGE
●GRANT ON LARGE OBJECT
●GRANT ON SCHEMA
●GRANT ON TABLESPACE
●GRANT role_name TO role_name
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 46/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
47. Objetos de la DB y Accesos
2. Accesos
b) Los permisos - GRANT
●GRANT ON TABLE
●GRANT ( column ) ON TABLE
prueba4=# create role usr3 password 'usr3' login;
prueba4=# create table tbl_acceso (id integer, nombre varchar(100));
prueba4=# grant insert on table tbl_accesos to usr3;
Como usr3
prueba4=> select * from tbl_acceso;
ERROR: permission denied for relation tbl_acceso
prueba4=> insert into tbl_acceso values ( 1, 'ernesto');
INSERT 0 1
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 47/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
48. Objetos de la DB y Accesos
2. Accesos
b) Los permisos - GRANT
●GRANT ON TABLE
●GRANT ( column ) ON TABLE
prueba4=# grant select (nombre) on tbl_acceso to usr3;
GRANT
Como usr3
prueba4=> select * from tbl_acceso;
ERROR: permission denied for relation tbl_acceso
prueba4=> select nombre from tbl_acceso;
nombre
---------
ernesto
No existe GRANT para “vistas”, se tratan como tablas (usar ON TABLE).
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 48/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
49. Objetos de la DB y Accesos
2. Accesos
b) Los permisos - GRANT
●GRANT ON DATABASE
●GRANT ON SCHEMA
prueba4=# create table sin_acceso.prueba(id integer);
CREATE TABLE
Como usuario usr3
prueba4=> select * from sin_acceso.prueba;
ERROR: permission denied for schema sin_acceso
LINE 1: select * from sin_acceso.prueba;
Como superusuario:
prueba4=# grant usage on sin_acceso to usr3;
prueba4=# grant select on table sin_acceso.prueba to usr3;
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 49/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
50. Objetos de la DB y Accesos
2. Accesos
b) Los permisos - REVOKE
Sigue más o menos la misma estructura de GRANT salvo que en vez de dar
permisos los retira.
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 50/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
51. Objetos de la DB y Accesos
2. Accesos
c) Usuarios del dbms vs Usuarios de la aplicación
Muchas aplicaciones (especialmente web) siguen la lógica de conectarse a la
dbms usando un solo usuario y controlan los accesos a opciones del sistema.
Esto es muy práctico de mantener, no llena la dbms de usuarios, PERO,
permite que todos tengan el mismo nivel de acceso a todos los objetos de la
db con los problemas que esto puede tener.
Para ver los accesos superiores de un rol puede utilizar este comando:
prueba4=> select * from pg_user;
usename | usesysid | usecreatedb | usesuper | usecatupd | passwd | valuntil | useconfig
-----------+----------+-------------+----------+-----------+----------+----------+-----------
postgres | 10 | t | t | t | ******** | |
dbadmin | 16392 | t | t | t | ******** | |
pgsql | 16643 | t | t | t | ******** | |
usr3 | 24410 | f | f | f | ******** | infinity |
usr4 | 24414 | f | f | f | ******** | |
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 51/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
52. Objetos de la DB y Accesos
2. Accesos
c) Usuarios del dbms vs Usuarios de la aplicación
OjO, todas las claves por defecto se guardan encriptadas en MD5 (lo cual
es relativamente seguro, pero no totalmente) sin embargo cerciórese de no
generar claves sin encriptación ya que fácilmente se puede ver estas con el
siguiente comando:
template1=# create role usr8 unencrypted password 'se_me_ve_todo' login;
template1=# select usename, passwd from pg_shadow;
usename | passwd
+
postgres | md54abfba9c735cfbc34d97b56a593120c0
dbadmin | md5695c0e25f6fe7c4ce633c67292190b90
pgsql |
usr1 | md51575823e236277b188fdd5d691aa8d08
usr3 | md5f06099b5e97add7ed510d76e24146f1e
usr8 | se_me_ve_todo
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 52/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
53. Objetos de la DB y Accesos
2. Accesos
PRACTICA
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 53/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
54. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
a) Tablespace
Los tablespaces nos permite generar áreas de almacenamiento de objetos de
una db en directorios ó unidades de almacenamiento diferentes a la
determinada por defecto.
La ventaja de esto es que podemos balancear el trabajo de nuestra DB en
diversas unidades haciendo que nuestra performanse mejore notablemente.
Un tablespace puede ser:
●Otro disco duro
●Un “disco” de estado solido (SSD)
●Una memoria USB
●Un “disco” virtual (en RAM)
●Otros tipos de unidades de almacenamiento
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 54/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
55. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
a) Tablespace
CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'
El owner siempre es por defecto el creador, el directorio donde se creará
el tablespace debe estar VACIO y tener los permisos del usuario de Linux
que ejecuta el servicio del dbms.
Como root (o con sudo):
root@depeche:~# mkdir /home/tablespace
root@depeche:~# chown postgres:postgres /home/tablespace/
En consola de PgSQL:
template1=# create tablespace ts_prueba location '/home/tablespace';
template1=# create table tbl_prueba(id serial) tablespace ts_prueba;
Como root:
root@depeche:/home/tablespace# ls -la
total 16
drwx------ 3 postgres postgres 4096 2010-10-04 12:43 .
drwxr-xr-x 4 root root 4096 2010-10-04 12:35 ..
drwx------ 2 postgres postgres 4096 2010-10-04 12:43 1 <-- directorio de la data
-rw------- 1 postgres postgres 4 2010-10-04 12:41 PG_VERSION
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 55/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
56. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
a) Tablespace
Podemos usar esta funcionalidad con:
●Base de datos
●Tablas
●Indices
Se recomienda que los Tablespaces creados en discos virtuales ó memorias USB solo
almacenen objetos de la db de los cuales se puedo presncindir como tablas temporales,
esto debido a que son muy volátiles y fácil de corromper o perder los datos (por
ejemplo tener un tablespace en disco virtual desaparece si alguien reinicia el
servidor).
Los tablespace de índices tienen una muy buena persormanse en discos SSD.
Más sobre tablespace en ram:
http://wiki.postgresql.org/wiki/La_verdad_y_la_mentira_de_los_tablespaces_en_memoria
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 56/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
57. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
b) Tablas particionadas
Las tablas particionadas nos permiten crear diferentes espacios de almacenamiento para
una data en común.
template1=# create table tbl_padre(cuenta char(10));
template1=# create table tbl_hija10(cuenta char(10)) inherits (tbl_padre);
template1=# create table tbl_hija20(cuenta char(10)) inherits (tbl_padre);
template1=# insert into tbl_hija20 values('20.01');
template1=# insert into tbl_hija10 values('10.01');
template1=# select * from tbl_padre;
cuenta
------------
10.01
20.01
template1=# select * from tbl_hija10;
cuenta
------------
10.01
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 57/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
58. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
b) Tablas particionadas
template1=# create table tbl_hija30(descripcion varchar(100)) inherits (tbl_padre);
template1=# insert into tbl_hija30 values('30.01', 'orden');
template1=# select * from tbl_hija30;
cuenta | descripcion
------------+-------------
30.01 | orden
template1=# select * from tbl_padre;
cuenta
------------
..
30.01
template1=# create table tbl_hija40() inherits (tbl_padre);
template1=# insert into tbl_hija40 values('40.01');
template1=# select * from tbl_padre;
cuenta
------------
...
40.01
template1=# select * from tbl_hija40;
cuenta
------------
40.01
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 58/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
59. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
b) Tablas particionadas
template1=# create table tbl_hija50( check (substr(cuenta,1,1) = '5' )) inherits (tbl_padre);
template1=# insert into tbl_hija50 values('540.01');
template1=# insert into tbl_hija50 values('640.01');
ERROR: el nuevo registro para la relación «tbl_hija50» viola la restricción check
«tbl_hija50_cuenta_check»
template1=# select * from tbl_padrE;
cuenta
------------
...
540.01
template1=# drop table tbl_padre;
ERROR: no se puede eliminar tabla tbl_padre porque otros objetos dependen de él
DETALLE: tabla tbl_hija10 depende de tabla tbl_padre
tabla tbl_hija20 depende de tabla tbl_padre
tabla tbl_hija30 depende de tabla tbl_padre
tabla tbl_hija40 depende de tabla tbl_padre
SUGERENCIA: Use DROP ... CASCADE para eliminar además los objetos dependientes.
template1=# drop table tbl_hija20;
DROP TABLE
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 59/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
60. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
b) Tablas particionadas
Supongamos que tenemos el caso de una tabla de movimientos contables, con millones de
registros por mes y decidimos crear una tabla por mes, pero es tanta data que
necesitamos grabarla en diferentes unidades físicas de almacenamiento, aplicamos:
template1=# create table tbl_hija60( check (substr(cuenta,1,1) = '6' )) inherits (tbl_padre)
tablespace ts_prueba;
CREATE TABLE
A cada tabla “hija” podemos aplicarle sus propios índices y relaciones, al igual que a
la tabla padre.
template1=# create index idx_padre on tbl_padre(cuenta);
CREATE INDEX
template1=# create index idx_padre2 on tbl_padre(cuenta) tablespace ts_prueba;
CREATE INDEX
Para retirar la herencia entre las tablas.
template1=# alter table tbl_hija30 no inherit tbl_padre;
template1=# select * from tbl_padre;
cuenta
------------
10.01
40.01
540.01
(3 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 60/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
61. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
b) Tablas particionadas
Podemos crear rules o triggers para manejar la correcta desviación de los datos cuando
se intenta grabar en la tabla principal ó padre.
template1=# CREATE RULE rl_tbl_padre10 AS
template1-# ON INSERT TO tbl_padre WHERE ( substr(cuenta,1,2) = '10' )
template1-# DO INSTEAD INSERT INTO tbl_hija10 VALUES (NEW.cuenta);
template1=# insert into tbl_padre values ('10.02');
template1=# select * from tbl_padre;
cuenta
------------
00.01
10.01
10.02
40.01
540.01
(5 filas)
template1=# select * from tbl_hija10;
cuenta
------------
10.01
10.02
(2 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 61/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
62. Objetos de la DB y Accesos
3. TableSpaces y Tablas Particionadas
b) Tablas particionadas
PRACTICA
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 62/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
63. SQL y Tipos de Datos Especiales
1. Creando estructuras de datos
Los Types son estructuras de datos definidas por el usuario, además de los ejemplos especificados en las
láminas 35 a 37 también podemos:
a) Types de datos enumerados
template1=# create type mes as enum ('enero', 'febrero', 'marzo');
CREATE TYPE
template1=# create table tbl_mes ( fecha mes);
CREATE TABLE
template1=# insert into tbl_mes values ('enero');
INSERT 0 1
template1=# insert into tbl_mes values ('abril');
ERROR: la sintaxis de entrada no es válida para el enum mes: «abril»
LÍNEA 1: insert into tbl_mes values ('abril');
El orden de los enumerados en caso de aplicar al campo un “order by” es el orden en el
que fueron declarados los valores.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 63/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
64. SQL y Tipos de Datos Especiales
1. Creando estructuras de datos
b) Types de retorno de estructura de datos
template1=# create type tpy_cuenta as( cmp_cuenta char(10));
CREATE TYPE
template1=# create function fn_cuenta () returns setof tpy_cuenta as $$ select cuenta from tbl_padre
$$ language sql;
CREATE FUNCTION
template1=# select fn_cuenta();
fn_cuenta
----------------
("00.01 ")
("10.01 ")
("10.02 ")
("40.01 ")
("540.01 ")
(5 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 64/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
65. SQL y Tipos de Datos Especiales
2. Tipos de datos
a)Tipos de datos numéricos
●smallint
●integer
●bigint
●decimal
●numeric
●Real <-- tomar en cuenta la presición de punto flotante, por ejemplo 10
podría guardarse como 9.9999999E9
●double precision <-- mismo caso que real
●Serial <-- genera automáticamente una “secuencia”, los seriales actualizan
sus datos dependiendo cuantas veces se ejecute un “nextval()” de
la secuencia, si la transacción no se completa se generará un
“hueco” en el contador.
●Bigserial
●Money <-- inserta el símbolo de la moneda por delante, podemos precisar
el símbolo cambiando el “locale” del parámetro lc_monetary en
postgresql.conf
●Booelan <-- true ó false, 1 ó 0
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 65/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
66. SQL y Tipos de Datos Especiales
2. Tipos de datos
b)Tipos de datos caractér
●character varying() ó varchar(n)
●character(n) ó char(n)
●Text
c) tipo de datos fecha
● timestamp without time zone <-- considere que guardar fecha y tiempo juntos no ayuda
a la formación de querys de búsqueda, por ejemplo:
prueba=# create table tbl_fecha ( fecha timestamp);
prueba=# insert into tbl_fecha values ('2010-01-01');
prueba=# insert into tbl_fecha values ('2010-01-02 01:01:01');
prueba=# select * from tbl_fecha where fecha >= '2010-01-01' and fecha <= '2010-01-02';
fecha
---------------------
2010-01-01 00:00:00
prueba=# select * from tbl_fecha where fecha >= '2010-01-01' and fecha <= '2010-01-02 23:59:59';
fecha
---------------------
2010-01-01 00:00:00
2010-01-02 01:01:01
●timestamp with time zone
●date
●time without time zone
●time with time zone
●interval
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 66/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
67. SQL y Tipos de Datos Especiales
2. Tipos de datos
d)Tipos direcciones de red
●Cidr <-- solo Ips v.4 ó v.6
●inet <-- Ips v.4 ó v.6 ó hostnames
●Macaddr <-- dirección de identificador único de una NIC
prueba=# create table tbl_inet ( host cidr, hostname varchar(32));
prueba=# insert into tbl_inet values ( '192.168.1.1','192.168.1.1');
INSERT 0 1
prueba=# insert into tbl_inet values ( '292.168.1.1','192.168.1.1');
ERROR: la sintaxis de entrada no es válida para tipo cidr: «292.168.1.1»
LÍNEA 1: insert into tbl_inet values ( '292.168.1.1','192.168.1.1');
^
prueba=# insert into tbl_inet values ( '192.168.1.1','292.168.1.1');
INSERT 0 1
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 67/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
68. SQL y Tipos de Datos Especiales
2. Tipos de datos
PRACTICA
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 68/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
69. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
a)Tsvector
El tipo de datos Vector nos permite almacenar cadenas en lexemas para facilitar las
búsquedas de cadenas específicas en textos muy largos.
prueba=# create table tbl_vector ( campo1 text, campo2 tsvector);
prueba=# insert into tbl_vector values ( 'esta es una pruena de un vector repitiendo la palabra vector','esta es una
prueba de un vector repitiendo la palabra vector');
prueba=# insert into tbl_vector values ( 'esta es una pruena de un vector repitiendo la palabra vector','esta es una
prueba de un vector repitiendo la palabra vector');
prueba=# insert into tbl_vector values ( 'árbol y vector añade acentos y eñes','árbol y vector añade acentos y eñes');
prueba=# insert into tbl_vector values ( 'las ratas y los ratones estan ratoneando un rato', 'las ratas y los ratones
estan ratoneando un rato');
^
prueba=# select * from tbl_vector;
campo1 | campo2
--------------------------------------------------------------+---------------------------------------------------------------------------
esta es una pruena de un vector | 'de' 'es' 'esta' 'prueba' 'un' 'una' 'vector'
esta es una pruena de un vector repitiendo la palabra vector | 'de' 'es' 'esta' 'la' 'palabra' 'prueba' 'repitiendo' 'un' 'una' 'vector'
árbol y vector añade acentos y eñes | 'acentos' 'añade' 'eñes' 'vector' 'y' 'árbol'
las ratas y los ratones estan ratoneando un rato | 'estan' 'las' 'los' 'ratas' 'rato' 'ratoneando' 'ratones' 'un' 'y'
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 69/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
70. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
a)Tsvector
prueba=# select campo1 from tbl_vector where to_tsvector(campo1) @@ to_tsquery('añade');
campo1
-------------------------------------
árbol y vector añade acentos y eñes
prueba=# select campo1 from tbl_vector where to_tsvector(campo1) @@ to_tsquery('vector & palabra');
campo1
--------------------------------------------------------------
esta es una pruena de un vector repitiendo la palabra vector
Podemos acceder directamente al campo del vector.
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('pg_catalog.spanish','vector');
campo1
--------------------------------------------------------------
esta es una pruena de un vector
esta es una pruena de un vector repitiendo la palabra vector
árbol y vector añade acentos y eñes
Pero esto no funciona, ¿porque?
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('pg_catalog.spanish','palabra');
campo1
--------
(0 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 70/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
71. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
a)Tsvector
Para una mejor administración de los datos debemos especificar el idioma en el cual
estamos añadiendo los datos.
prueba=# insert into tbl_vector values('esto añade soporte en español', to_tsvector('pg_catalog.spanish','esto añade
soporte en español'));
prueba=# select campo2 from tbl_vector;
campo2
---------------------------------------------------------------------------
'acentos' 'añade' 'eñes' 'vector' 'y' 'árbol'
'añad':2 'español':5 'soport':3
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('pg_catalog.spanish','añad');
campo1
-------------------------------
esto añade soporte en español
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('pg_catalog.spanish','añada');
campo1
-------------------------------
esto añade soporte en español
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 71/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
72. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
a)Tsvector
Tenemos a nuestra disposición diferentes operadores lógicos
prueba=# delete from tbl_vector;
prueba=# insert into tbl_vector values('esto añade soporte en español', to_tsvector('pg_catalog.spanish','esto añade
soporte en español'));
prueba=# insert into tbl_vector values('vamos a repetir vector 2 veces más, vector, vector',
to_tsvector('pg_catalog.spanish','vamos a repetir vector 2 veces más, vector, vector'));
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('añada & vector');
campo1
--------
(0 filas)
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('añada | vector');
campo1
----------------------------------------------------
esto añade soporte en español
vamos a repetir vector 2 veces más, vector, vector
(2 filas)
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('!vec');
campo1
-------------------------------
esto añade soporte en español
prueba=# select campo1 from tbl_vector where campo2 @@ to_tsquery('!vec & añada');
campo1
-------------------------------
esto añade soporte en español
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 72/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
73. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
a)Tsvector
Para combinar operadores lógicos entre varios campos:
&& <-- and
●|| <-- or
●!! <-- not
Los vectores se pueden indexar, para ellos existe el tipo de índice GIN.
prueba=# create index idx_vector3 on tbl_vector using gin(campo2);
CREATE INDEX
En caso de que los textos se actualicen demasiado seguido entonces podemos crear un
trigger para que actualice la columna donde están guardados los lexemas.
Para listar los lexemas más usados:
prueba=# SELECT * FROM ts_stat('SELECT campo2 FROM tbl_vector') ORDER BY nentry DESC, ndoc DESC, word LIMIT 5;
word | ndoc | nentry
---------+------+--------
cociner | 1 | 5
adrià | 1 | 3
gaston | 1 | 3
mund | 1 | 3
peruan | 1 | 3
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 73/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
74. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
b)Arreglos
Los arreglos en PostgreSQL son como en cualquier lenguaje de programación, su longitud
y dimensión es variable.
prueba4=# create table tbl_array (data int[]);
prueba4=# insert into tbl_array values('{1,2,3,4,5}');
prueba4=# select * from tbl_array;
data
-------------
{1,2,3,4,5}
prueba4=# alter table tbl_array add column data2 int[][];
prueba4=# insert into tbl_array (data2) values('{{1,2},{2,3},{3,4},{4,5},{5,6}}');
prueba4=# select * from tbl_array;
data | data2
-------------+---------------------------------
{1,2,3,4,5} |
| {{1,2},{2,3},{3,4},{4,5},{5,6}}
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 74/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
75. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
b)Arreglos
prueba4=# select data from tbl_array where data[2]=2;
data
-------------
{1,2,3,4,5}
(1 row)
prueba4=# select data from tbl_array where data[2]=1;
data
------
(0 rows)
prueba4=# select data2 from tbl_array where data2[1][2]=2;
data2
---------------------------------
{{1,2},{2,3},{3,4},{4,5},{5,6}}
(1 row)
prueba4=# select data2 from tbl_array where data2[1][3]=2;
data2
-------
(0 rows)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 75/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
76. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
b)Arreglos
prueba4=# alter table tbl_array add column data3 int[][3];
ALTER TABLE
prueba4=# insert into tbl_array (data3) values('{{1,2,3},{2,3,4}}');
INSERT 0 1
prueba4=# select * from tbl_array;
data | data2 | data3
-------------+---------------------------------+-------------------
{1,2,3,4,5} | |
| {{1,2},{2,3},{3,4},{4,5},{5,6}} |
| | {{1,2,3},{2,3,4}}
(3 rows)
prueba4=# select data3 from tbl_array where data3[2][3]=4;
data3
-------------------
{{1,2,3},{2,3,4}}
(1 row
prueba4=# select data3 from tbl_array where data3[2][5]=4;
data3
-------
(0 rows)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 76/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
77. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
c)OIDs
Los OIDs son identificadores únicos de los objetos en la base de datos, incluso cada
registro tiene un OID propio que jamas se repite en ninguna otra tabla.
prueba4=# create table tbl_oid2(id integer) with oids;
prueba4=# insert into tbl_oid2 values(1);
INSERT 24446 1
prueba4=# insert into tbl_oid2 values(2);
INSERT 24447 1
prueba4=# select * from tbl_oid2;
id
----
1
2
(2 rows)
prueba4=# select oid,* from tbl_oid2;
oid | id
-------+----
24446 | 1
24447 | 2
(2 rows)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 77/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
78. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
c)OIDs
Para obtener los oids de los objetos en la base de datos
prueba4=# select oid,relname from pg_class where substr(relname,1,3) = 'tbl';
oid | relname
-------+---------------------
...
24440 | tbl_oid
24443 | tbl_oid2
prueba4=# SELECT attrelid,attname FROM pg_attribute where attrelid = 'tbl_oid2'::Regclass;
attrelid | attname
----------+----------
24443 | tableoid
...
24443 | oid
...
24443 | id
prueba4=# SELECT attrelid,attname FROM pg_attribute where attrelid = 'vw_vista'::Regclass;
attrelid | attname
----------+---------
24380 | id
24380 | nombre
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 78/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
79. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
c)OIDs
Podemos borrar data apuntando a su OID
prueba4=# delete from tbl_oid2 where oid = 24447;
DELETE 1
prueba4=# select * from tbl_oid2;
id
----
1
(1 row)
Ahora por defecto ya no se crean OIDs para data, esto debido a que en volúmenes muy
grandes de datos los OIDs podrían llegar a ser insuficientes y es por ello que se
prescinde de ellos por defecto.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 79/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
80. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
d)Very Large Objetcs
PostgreSQL permite guardar binarios dentro de una tabla de muchos gigas de extensión,
estos files no se guardan directamente dentro de la tabla creada sino en un ambiente
especial y se apunta el oid del file para acceder a este.
prueba4=# create table tbl_files( name varchar(100), file oid);
prueba4=# insert into tbl_files values('primer archivo',
lo_import('/home/ernesto/Descargas/Programa.pdf'));
INSERT 0 1
prueba4=# select * from tbl_files;
name | file
----------------+-------
primer archivo | 24455
(1 row
prueba4=# select lo_export(tbl_files.file,'/tmp/Programa.pdf') from tbl_files where file = '24455';
lo_export
-----------
1
(1 row)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 80/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
81. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
d)Very Large Objetcs
Para retirar el binario añadido a la base de datos.
prueba4=# update tbl_files set file = null; <-- borramos el link pero no la data
prueba4=# insert into tbl_files values('segundo archivo', lo_import('/home/ernesto/Descargas/LAN.png'));
prueba4=# select * from tbl_files;
name | file
-----------------+-------
primer archivo |
segundo archivo | 24456
prueba4=# select lo_unlink(tbl_files.file) from tbl_files where file = 24456;
lo_unlink
-----------
1
prueba4=# update tbl_files set file= lo_import('/home/ernesto/Descargas/LAN.png') where name = 'segundo
archivo';
prueba4=# select * from tbl_files;
name | file
-----------------+-------
primer archivo |
segundo archivo | 24457
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 81/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
82. SQL y Tipos de Datos Especiales
3. Tipos de datos especiales
PRACTICA
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 82/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
83. SQL y Tipos de Datos Especiales
4. Sentencias SQL
a)Insert
prueba=# create table tbl_simple ( id serial, nombre varchar(10));
NOTICE: CREATE TABLE creará una secuencia implícita «tbl_simple_id_seq» para la columna serial
«tbl_simple.id»
CREATE TABLE
prueba=# insert into tbl_simple (nombre) values ('ernesto') returning id;
id
----
1
prueba=# insert into tbl_simple (nombre) values ('juan') returning id;
id
----
2
prueba=# insert into tbl_simple (nombre) values ('estosupera10caracteres') returning id;
ERROR: el valor es demasiado largo para el tipo character varying(10)
prueba=# insert into tbl_simple (nombre) values ('10chars') returning id;
id
----
3
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 83/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
84. SQL y Tipos de Datos Especiales
4. Sentencias SQL
a)Insert
NOTICE: CREATE TABLE creará una secuencia implícita «tbl_simple2_id_seq» para la columna serial
«tbl_simple2.id»
CREATE TABLE
prueba=# insert into tbl_simple2 ( nombre) select nombre from tbl_simple;
INSERT 0 4
prueba=# select * from tbl_simple2;
id | nombre
----+---------
1 | ernesto
2 | juan
3 | 111
4 | 10chars
(4 filas)
prueba=# insert into tbl_simple2 ( nombrE) select nombre from tbl_simple returning id;
id
----
5
6
7
8
(4 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 84/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
85. SQL y Tipos de Datos Especiales
4. Sentencias SQL
b)Update
prueba=# select * from tbl_simple;
id | nombre
----+---------
1 | ernesto
2 | juan
3 | 111
4 | 10chars
prueba=# update tbl_simple2 set nombre = '1'||nombre;
UPDATE 8
prueba=# update tbl_simple set nombre = (select tbl_simple2.nombre from tbl_simple2 where
tbl_simple2.id = tbl_simple.id);
UPDATE 4
prueba=# select * from tbl_simple;
id | nombre
----+----------
1 | 1ernesto
2 | 1juan
3 | 1111
4 | 110chars
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 85/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
86. SQL y Tipos de Datos Especiales
4. Sentencias SQL
b)Update
prueba=# update tbl_simple2 set nombre = '2'||nombre;
prueba=# update tbl_simple set nombre = a.nombre from ( select id, nombre from tbl_simple2) as a
where tbl_simple.id = a.id;
UPDATE 4
prueba=# select * from tbl_simple;
id | nombre
----+-----------
1 | 21ernesto
2 | 21juan
3 | 21111
4 | 2110chars
prueba=# update tbl_simple set nombre = a.nombre from ( select id, nombre from tbl_simple2) as a
where tbl_simple.id = a.id returning tbl_simple.*;
id | nombre
----+-----------
1 | 21ernesto
2 | 21juan
3 | 21111
4 | 2110chars
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 86/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
87. SQL y Tipos de Datos Especiales
4. Sentencias SQL
b)Update
prueba=# update tbl_simple set nombre = a.nombre from ( select tbl_simple2.id, tbl_simple2.nombre
from tbl_simple2 join tbl_simple on tbl_simple.id = tbl_simple2.id) as a where a.id=tbl_simple.id
returning tbl_simple.*;
id | nombre
----+------------
1 | 321ernesto
2 | 321juan
3 | 321111
4 | 32110chars
(4 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 87/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
88. SQL y Tipos de Datos Especiales
4. Sentencias SQL
c)Delete
prueba=# delete from tbl_simple using tbl_simple2 where tbl_simple.id=tbl_simple2.id returning
tbl_simple.*;
id | nombre
----+------------
1 | 321ernesto
2 | 321juan
3 | 321111
4 | 32110chars
prueba=# select * from tbl_simple;
id | nombre
----+--------
(0 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 88/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
89. SQL y Tipos de Datos Especiales
4. Sentencias SQL
d)Copy
Copy es una excelente alternativa cuando debemos cargar información de millares de
registros en una tabla, es mucho más eficiente que hacer varios insert o un insertde
un select.
Copy además nos permite generar un un archivo exportado con datos.
prueba=# copy tbl_simple2 to '/tmp/uno.txt';
COPY 8
prueba=# copy tbl_simple2(nombre) to '/tmp/uno.txt';
COPY 8
prueba=# copy (select * from tbl_simple2) to '/tmp/uno.txt';
COPY 8
prueba=# copy (select * from tbl_simple2) to stdin;
1 321ernesto
2 321juan
3 321111
4 32110chars
5 321ernesto
6 321juan
7 321111
8 32110chars
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 89/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
90. SQL y Tipos de Datos Especiales
4. Sentencias SQL
d)Copy
prueba=# select * from tbl_simple;
id | nombre
----+--------
(0 filas)
prueba=# copy tbl_simple from '/tmp/uno.txt';
COPY 8
prueba=# select * from tbl_simple;
id | nombre
----+------------
1 | 321ernesto
2 | 321juan
3 | 321111
4 | 32110chars
5 | 321ernesto
6 | 321juan
7 | 321111
8 | 32110chars
(8 filas)
http://www.postgresql.org/docs/9.0/interactive/sql-copy.html
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 90/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
91. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select - OVER
prueba=# select * from tbl_window;
mes | nombre | sueldo
--------+---------+--------
201001 | ernesto | 10
201002 | ernesto | 11
201003 | ernesto | 12
201001 | juan | 13
201003 | juan | 15
201002 | juan | 14
prueba=# select nombre, mes, sueldo, sum(sueldo) as sueldo_total over (partition by nombre) from tbl_window;
nombre | mes | sueldo | sueldo_total
---------+--------+--------+-------------
ernesto | 201001 | 10 | 33
ernesto | 201002 | 11 | 33
ernesto | 201003 | 12 | 33
juan | 201001 | 13 | 42
juan | 201003 | 15 | 42
juan | 201002 | 14 | 42
prueba=# select nombre, mes, sueldo, sum(sueldo) over (partition by nombre) sueldo_total, sum(sueldo) over (partition by
nombre) / 3 as sueldo_promedio, (sum(sueldo) over (partition by nombre) / 3 )- sueldo as desviacion_promedio from
tbl_window;
nombre | mes | sueldo | sueldo_total | sueldo_promedio | desviacion_promedio
---------+--------+--------+--------------+-----------------+---------------------
ernesto | 201001 | 10 | 33 | 11 | 1
ernesto | 201002 | 11 | 33 | 11 | 0
ernesto | 201003 | 12 | 33 | 11 | -1
juan | 201001 | 13 | 42 | 14 | 1
juan | 201003 | 15 | 42 | 14 | -1
juan | 201002 | 14 | 42 | 14 | 0
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 91/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
92. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select - OVER
prueba=# select nombre, mes, sueldo, sum(sueldo) over (partition by nombre order by nombre desc, mes ) from tbl_window;
nombre | mes | sueldo | sum
---------+--------+--------+-----
juan | 201001 | 13 | 13
juan | 201002 | 14 | 27
juan | 201003 | 15 | 42
ernesto | 201001 | 10 | 10
ernesto | 201002 | 11 | 21
ernesto | 201003 | 12 | 33
prueba=# select nombre, mes, sueldo, rank() over (partition by nombre order by sueldo desc) from tbl_window;
nombre | mes | sueldo | rank
---------+--------+--------+------
ernesto | 201003 | 12 | 1
ernesto | 201002 | 11 | 2
ernesto | 201001 | 10 | 3
juan | 201003 | 15 | 1
juan | 201002 | 14 | 2
juan | 201001 | 13 | 3
prueba=# select nombre, sueldo, mes, sum(sueldo) over ventana, avg(sueldo) over ventana from tbl_window window ventana
as (partition by nombre);
nombre | sueldo | mes | sum | avg
---------+--------+--------+-----+---------------------
ernesto | 10 | 201001 | 33 | 11.0000000000000000
ernesto | 11 | 201002 | 33 | 11.0000000000000000
ernesto | 12 | 201003 | 33 | 11.0000000000000000
juan | 13 | 201001 | 42 | 14.0000000000000000
juan | 15 | 201003 | 42 | 14.0000000000000000
juan | 14 | 201002 | 42 | 14.0000000000000000
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 92/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
93. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select – FROM ONLY
prueba=# create table ciudades ( nombre varchar(100));
prueba=# create table capitales ( capital boolean) inherits (ciudades);
prueba=# insert into ciudades values ('callao');
prueba=# insert into ciudades values ('piura');
prueba=# insert into capitales values ('lima', true);
prueba=# insert into capitales values ('buenos aires', true);
prueba=# select * from ciudades;
nombre
--------------
callao
piura
lima
buenos aires
(4 filas)
prueba=# select * from only ciudades;
nombre
--------
callao
piura
(2 filas)
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 93/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
94. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select – Variaciones de Distinct
prueba=# select distinct nombre, id from tbl_simple2;
nombre | id
------------+----
32110chars | 8
321111 | 3
321111 | 7
321juan | 2
321ernesto | 5
321juan | 6
321ernesto | 1
32110chars | 4
prueba=# select distinct on (nombre) nombre, id from tbl_simple2 order by 1 desc, 2;
nombre | id
------------+----
321juan | 2
321ernesto | 1
321111 | 3
32110chars | 4
prueba=# select distinct on (nombre) nombre, id from tbl_simple2 order by 1, 2 desc;
nombre | id
------------+----
32110chars | 8
321111 | 7
321ernesto | 5
321juan | 6
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 94/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
95. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select – FETCH y LIMIT
prueba=# select * from tbl_simple2 fetch first 3 rows only;
id | nombre
----+------------
1 | 321ernesto
2 | 321juan
3 | 321111
(3 filas)
prueba=# select * from tbl_simple2 limit 3;
id | nombre
----+------------
1 | 321ernesto
2 | 321juan
3 | 321111
(3 filas)
A simple vista parecen iguales, pero en el caso de Limit en siguientes ocasiones donde
se ejecute el query el orden en el que tome los datos no necesariamente será el mismo
(en el que se almacenaron en la db) a menos que se use un ORDER BY, para FETCH el
orden siempre sera igual.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 95/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
96. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select – FOR UPDATE / FOR SHARE
FOR UDATE bloqueda el acceso a los registros que se solicitan de tal manera que el
query no desbloqueara los registros hasta que haya culminado la transacción en curso.
prueba=# select * from tbl_simple2 limit 2 for update;
FOR SHARE permite que se modifiquen los datos.
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 96/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
97. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select – WITH
Facilitamos el trabajo de subquerys definiendolo para ser usados varias veces.
prueba=# select * from tbl_simple2;
id | nombre
----+---------
10 | ernesto
20 | juan
12 | pedro
12 | ernesto
prueba=# select nombre, sum(id) from tbl_simple2 group by nombre;
nombre | sum
---------+-----
pedro | 12
ernesto | 22
juan | 20
prueba=# with suma as ( select nombre, sum(id) from tbl_simple2 group by nombre order by 2 desc limit 2) select nombre,
id from tbl_simple2 where nombre in (select nombre from suma);
nombre | id
---------+----
ernesto | 10
juan | 20
ernesto | 12
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 97/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957
98. SQL y Tipos de Datos Especiales
4. Sentencias SQL
e)Select – SIMILAR TO
Hacemos búsquedas por expresiones regulares
prueba4=# select * from log_regla;
fecha | id | nombre | estado
+++
20101008 20:26:37.200866 | 2 | Ernesto | I
20101008 20:49:24.691783 | 8 | pedro | I
20101008 21:00:08.529349 | 1 | alejandro | U
20101008 21:21:55.82194 | 5 | pepelucho | U
prueba4=# select * from log_regla where nombre similar to '%(a|c)%'; < contiene a ó c
fecha | id | nombre | estado
+++
20101008 21:00:08.529349 | 1 | alejandro | U
20101008 21:21:55.82194 | 5 | pepelucho | U
prueba4=# select * from log_regla where nombre similar to '%(x|f)%';
fecha | id | nombre | estado
+++
EQ Soft Consultoría y Soporte E.I.R.L. Curso de PostgreSQL DBA
Http://www.eqsoft.net 98/186
informes@eqsoft.net
Teléfonos: (51) 01–5645744 / 01-5645424 / 997244926 / 997003957