PostgreSQL - I
PostgreSQL - I
PostgreSQL - I
PostgreSQL usa Hot Standby: Capacidad de conectarse al servidor y ejecutar consultas de solo
lectura mientras el servidor está en modo de recuperación de archivos o en espera. Esto es útil
tanto para fines de replicación como para restaurar una copia de seguridad al estado deseado
con gran precisión.
Breve historia de PostgreSQL
A su vez soporta una gran parte del estándar SQL y ofrece muchas características modernas
como:
Querys complejos
Sub-querys
Foreign keys
Esquemas
Trigger
Vistas
Transacciones
MVCC (Multiversion Concurrency Control)
Streaming Replication
Hot Standby
Breve historia de PostgreSQL
Además de lo anterior, PostgreSQL soporta cuatro estándares de stored procedures, los cuales
permiten que el usuario construya sus propios scripts en cualquiera de los siguientes lenguajes:
PL/pgSQL, PL/Tcl, PL/Perl y PL/Python. En adición, otros lenguajes no estándar como PL/PHP,
PL/V8, PL/Ruby, PL/Java.
PostgreSQL viene con muchas características destinadas a ayudar a los desarrolladores a crear
aplicaciones, a los administradores a proteger la integridad de los datos y a crear entornos
tolerantes a fallas, y a ayudarlo a administrar sus datos sin importar cuán grande o pequeño sea
el conjunto de datos. Además de ser gratuito y de código abierto, PostgreSQL es altamente
extensible. Por ejemplo, puede definir sus propios tipos de datos, crear funciones
personalizadas, o escribir código desde diferentes lenguajes de programación sin recompilar su
base de datos
PostgreSQL intenta cumplir con el estándar SQL. Se admiten muchas de las características
requeridas por el estándar SQL, aunque a veces con una sintaxis o función ligeramente
diferente. A partir del lanzamiento de la versión 11 en octubre de 2018, PostgreSQL cumple con
al menos 160 de las 179 características obligatorias para SQL.
Porque usar PostgreSQL
PostgreSQL cumple con todo lo que requiere un manejador de bases de datos relacionales, e
incluso algunas características adicionales, es decir:
CARACTERÍSTICA
MULTIPLATAFORMA SI* SI SI SI
DATA WAREHOUSE SI SI NO SI
REPLICACION NATIVA SI SI SI NO
Los corchetes ([y]) indican opcional. (En la sinopsis de un comando Tcl, se utilizan
signos de interrogación (?))
Las llaves ({y}) y las líneas verticales (|) indican que debe elegir una alternativa.
Puntos suspensivos (...) significan que el elemento anterior se puede repetir.
Los comandos SQL son precedidos por el prompt => y los comandos de Shell están
precedidos por el prompt $.
Convenciones de nomenclatura
General:
Tablas:
Tablas:
Codificación en la descripción:
• Salida (S) : Son las tablas utilizadas para emitir información fuera del sistema en
diversos formatos (DBF, TXT, etc.)
• Temporal (T) : Son las tablas utilizadas para cálculos intermedios y que se crean y
borran a tal efecto (DM11, etc.)
• Codificación (C) : Son las tablas que se proveen en función de necesidades del sistema
y que no son actualizables por el usuario (pampacfg, etc.)
• Datos (D) : Son las tablas que pueden ser actualizadas por los usuarios del sistema
(DH01, DH30, etc.)
Convenciones de nomenclatura
Tablas:
Campos:
Campos:
Campos:
Cada vez que se quiera crear un tipo fecha, cantidad, importe o porcentaje se empleará el
siguiente prefijo:
• fec_
• cant_
• imp_
• porc_
Convenciones de nomenclatura
Restricciones:
Restricciones:
Check: En el Standard SQL99 existe la sentencia CREATE ASSERTIONS que sirve para
crear restricciones a nivel base de datos pero Postgres no lo implementa. En Postgres se
pueden especificar estas restricciones usando RULES o TRIGGERS.
• Checks a nivel columna: chk_nombre_tabla_nombre_de_check
• Checks a nivel tabla: Se pueden definir chequeos a nivel tabla cuando se crea la tabla o
se edita. (Excepto Case Studio)
• Checks a nivel base de datos
Convenciones de nomenclatura
Stored Procedures:
Para definir stored procedures en PostgreSQL hay que definirlos como funciones. Nombre
sugerido: modulo_nombre_del_storedprocedure
Convenciones de nomenclatura
Vistas:
El nombre de una vista debe comenzar con los tres caracteres correspondientes al módulo,
seguido de ‘_vista_’, seguido del nombre de la vista propiamente dicho.
Si se van a utilizar vistas para realizar inserciones y/o actualizaciones sobre tablas base,
debe tenerse en cuenta en su definición la cláusula WITH CHECK OPTION que controla que
la fila insertada o actualizada permanezca en la vista.
Resumen
Identificar errores:
Un programa termina con una señal fatal o un mensaje de error del sistema operativo
que apunte a un problema en el programa. (Mensaje de "disco lleno", que tu debas
corregir)
Un programa produce la salida incorrecta para cualquier entrada dada.
Un programa se niega a aceptar entradas válidas (como se define en la
documentación).
Un programa acepta entradas no válidas sin un aviso o mensaje de error.
No pueda compilar, construir o instalar de acuerdo con las instrucciones en las
plataformas compatibles.
Fallas de seguridad en el control de acceso a bases de datos, tablas, etc.
Informes de errores
Cómo reportarlos:
BSD
FreeBSD
OpenBSD
Linux
Red Hat family Linux (CentOS/Fedora/Scientific/Oracle variantes)
Debian GNU/Linux y derivados
Ubuntu Linux y derivados
SuSE and OpenSuSE
Otros
macOS
Solaris
Windows
Instalación de PostgreSQL
Dependiendo el SO, es
la forma en que se
descargue PostgreSQL.
Se visualizan las
opciones de instalación
y configuración de la
plataforma para habilitar
el inicio automático.
Instalación de PostgreSQL
Los instaladores fueron probados por EnterpriseDB en las siguientes plataformas. También
pueden funcionar en otras variaciones o versiones:
Instalación de PostgreSQL
La instalación debe crear un usuario llamado postgres. Para ingresar al servidor de Postgres
deberemos seguir los siguientes pasos desde la consola de Linux y logueados como root (El
tratar de acceder a postgres sin estar como administradores no tendrá éxito):
a) Ingresar como root, b) loguearse como usuario postgres, c) ingresar a la consola de PSQL.
Si recibe algún error desde el paso b, su instalación no fue exitosa. Deberá repetir los pasos
Arquitectura
La primera prueba para ver si puede acceder al servidor de bases de datos es intentar crear una
base de datos. Un servidor PostgreSQL puede administrar muchas bases de datos.
Normalmente, se utiliza una base de datos separada para cada proyecto o para cada usuario.
Para crear una nueva base de datos, en este ejemplo llamado base_curso, utilice el siguiente
comando: $ createdb base_curso
Un servidor PostgreSQL puede administrar muchas bases de datos. Normalmente, se utiliza una
base de datos separada para cada proyecto o para cada usuario.
Para crear una nueva base de datos, en este ejemplo llamado base_curso, utilice el comando
CREATE DATABASE
Un servidor PostgreSQL puede administrar muchas bases de datos. Normalmente, se utiliza una
base de datos separada para cada proyecto o para cada usuario.
Para crear una nueva base de datos, en este ejemplo llamado base_curso, utilice el comando
CREATE DATABASE
Ejemplo:
Adicionalmente se pueden agregar comentarios, los cuales no son tokens, pero son equivalentes
a espacios en blanco.
Sintaxis
Los tokens como SELECT, UPDATE son ejemplos de palabras clave, es decir, palabras que
tienen un significado fijo en el lenguaje SQL. Los tokens MiTabla y Campo1 son ejemplos de
identificadores. Identifican nombres de tablas, columnas u otros objetos de base de datos,
dependiendo de el comando en el que se usan. Por lo tanto, a veces simplemente se les llama
"nombres". Las palabras clave y los identificadores tienen la misma estructura léxica, lo que
significa que no se puede saber si un token es un identificador o una palabra clave sin conocer el
idioma.
Los identificadores SQL y las palabras clave deben comenzar con una letra o un guion bajo. Los
caracteres posteriores en un identificador o palabra clave pueden ser letras, guiones bajos,
dígitos (0-9) o signos de dólar ($). Tenga en cuenta que los signos de dólar no están permitidos
en los identificadores de acuerdo con la letra del estándar SQL, por lo que su uso podría hacer
que las aplicaciones sean menos portátiles.
Sintaxis
El estándar SQL no definirá una palabra clave que contenga dígitos o comience o termine con un
guion bajo, por lo que los identificadores formados de esa manera están seguros contra posibles
conflictos con futuras extensiones del estándar.
Las palabras clave y los identificadores sin comillas no distinguen entre mayúsculas y
minúsculas. Por lo tanto:
Una convención que se usa con frecuencia es escribir palabras clave en mayúsculas y nombres
en minúsculas, por ejemplo:
Hay tres tipos de constantes escritas implícitamente en PostgreSQL: cadenas, cadenas de bits y
números. Las constantes también se pueden especificar con tipos explícitos, lo que puede
permitir una representación más precisa y manejo más eficiente por parte del sistema.
*Resultado = 580
Tipos de datos
PostgreSQL admite los tipos SQL estándar int, smallint, real, double precision, char(N),
varchar(N), date, time, timestamp, e interval, así como otros tipos generales y un conjunto de
tipos geométricos. PostgreSQL se puede personalizar con un número arbitrario de tipos de datos
definidos por el usuario.
Definición y manipulación de datos
Crear tablas:
Para nombres de tablas, se puede utilizar cualquier caracter alfabético o numérico, el primero
debe ser un caracter alfabético y no puede contener espacios en blanco.
Definición y manipulación de datos
Modificar tablas:
Agregar columna
Modificar tablas:
Para ver la estructura de una tabla consultaremos una tabla propia del PostgreSQL:
SELECT table_name,column_name,udt_name,character_maximum_length
FROM information_schema.columns WHERE table_name = 'usuarios’;
Para eliminar una tabla usamos "drop table" junto al nombre de la tabla a eliminar:
Si intentamos eliminar una tabla que no existe, aparece un mensaje de error indicando tal
situación y la sentencia no se ejecuta, podemos escribir una variante de drop table verificando si
existe la tabla:
Insertar registros:
INSERT INTO nombre_tabla (columna1, columna2, columna3) VALUES (valor1, valor2, valor3);
INSERT INTO nombre_tabla (columna1, columna2, columna3) VALUES (valor1, valor2, valor3),
(otroValor1, otroValor2, otroValor3), (otroValorMas1, otroValorMas2, otroValorMas3);
Clausulas:
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
WHERE Utilizada para especificar las condiciones que deben reunir los registros que se van a
seleccionar
GROUP BY Utilizada para clasificar los registros seleccionados en grupos específicos
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo
ORDER BY Utilizada para ordenar los registros seleccionados de acuerdo con un orden
específico
Consultas
Operadores lógicos:
AND Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.
OR Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos es cierta.
NOT Devuelve el valor contrario de la expresión
IN Devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista.
Consultas
Operadores de comparación
+ Suma
- Resta
* Multiplicación
/ División
|| Concatenar
: Exponenciación Natural
^ Exponenciación
! Factorial
Consultas
Funciones de agregación:
Agrupamiento:
La cláusula GROUP BY unida a un SELECT permite agrupar filas según las columnas que se
indiquen como parámetros, y se suele utilizar en conjunto con las funciones de agrupación, para
obtener datos resumidos y agrupados por las columnas que se necesiten.
Los registros que vamos a obtener son todos aquellos en los que el campo común (id_producto)
exista en las dos tablas. Los registros de la tabla producto que su id_producto no coincida con el
id_producto de la tabla provincia y viceversa, los omite.
Transacciones y concurrencia
Una de las grandes ventajas de emplear bases de datos y más específicamente de emplear un
DBMS es que se procure un buen manejo de la información, garantizando que todas las
operaciones sean "ácidas", es decir, que cumplan con
Atomicity: que las transacciones sean atómicas, se vean como una sola unidad
Consistency: que los datos realmente estén bien relacionados y que no existan problemas de
falta de información o falta de confiabilidad en los datos
Isolation: aislamiento, separar las operaciones de distintas conexiones/usuarios unos de otros
Durability: que se garantice la persistencia de los datos.
Consultas
Transacciones
Una transacción es una unidad de programa que accesa y posiblemente actualiza varios
elementos de datos.
Crear Conexión
Abrir Conexión
(Openconnection)
Iniciar Transacción
(Begin Transaction) setAutoCommit(0/false)
Queries...
(Insert, Select, Update, Delete...)
-Error
(Abort Transaction) rollback
Procesar resultados
(Print, a= , b= )
Asegurar Transacción
(End Transaction) commit
Cerrar Conexión
(Closeconnection)
Consultas
Concurrencias
Es importante recordar que muchos de los datos de la base no se encuentran nada más en
disco, sino también en los buffers de memoria, de ahí que el scheduler interactúa con ellos y
en su defecto solicita la lectura de los datos del disco.
Consultas
Consultas
El calendarizador crea agendas, secuencias ordenadas de las acciones tomadas por una o más
transacciones.
Transacciones en SQL
El control de concurrencia es el que asegura que muchos usuarios puedan acceder a la data al
mismo tiempo.
Sin embargo al mismo tiempo se producen muchas operaciones de R/W, estas operaciones se
conocen como transacciones.
Ninguna transacción debe ver el resultado de otras transacciones inconclusas, si esto no fuera
así estaríamos leyendo datos inconsistentes.
Cuando 2 transacciones trabajan sobre el mismo objeto y al menos uno de ellos incluye
operaciones de escritura entonces se produce un “conflicto”.
Cuando 2 transacciones hacen exactamente lo mismo puede que sean “serializadas” para
optimizar el acceso a la data.
Consultas
Este bloqueo puede ser Compartido (Share) o Exclusivo (Exclusive), estos son administrador por
un “Lock Manager”. Existen varios tipos de bloqueos :
Consultas
Un bloqueo puede darse a una tupla, una página o una tabla completa.
Existe una tabla de locks, antes de ejecutar uno nuevo se consulta esta tabla.
Consultas
Consultas
READ UNCOMMITTED:
Apenas transaccional, permite hacer lecturas sucias (dirty reads), donde las consultas dentro de una
transacción son afectadas por cambios no confirmados (not commited) de otras transacciones
Consultas
READ COMMITTED:
Los cambios confirmados son visibles dentro de otra transacción esto significa que dos consultas dentro de
una misma transacción pueden retornar diferentes resultados (Generalmente este es el comportamiento por
defecto en los SGBD)
Consultas
REPEATABLE READ:
Dentro de una transacción todas las lecturas son consistentes (Esto es el comportamiento por defecto en
MySQL usando tablas en InnoDB