5 PostgreSQL
5.1 Introducción e historia
PostgreSQL es un sistema de gestión de bases de datos de tipo objeto-relacional, distribuido bajo licencia BSD y tiene el código fuente disponible de forma libre. Es uno de los gestores de bases de datos más potentes del mercado.
Este SGBD nació en 1985 bajo el nombre de POSTGRES, en la universidad de Berkeley con el propósito de resolver uno de los principales problemas a los que se enfrentaban los gestores de bases de datos relacionales de la época: la incapacidad de comprender “tipos”, es decir, lo que ahora llamamos objetos. Estaba basado en el proyecto Ingres pero no está basado en el mismo código fuente.
Más adelante se añadió soporte para el lenguaje SQL ya que anteriormente solo contaba con un intérprete de consultas QUEL. De esta forma POSTGRES pasó a llamarse PostgreSQL.
Actualmente (Junio de 2017) hay alrededor de 65 personas activas contribuyendo al desarrollo que forman el “core team” y hay una gran comunidad de usuarios y empresas que colaboran para mejorar PostgreSQL.
Su última versión estable es la 9.6 que fue lanzada el 11 de Mayo de 2017 y la siguiente versión es la 10 que a día de hoy está en Beta.
5.2 Características
Algunas de las principales características son:
Concurrencia. Usando un sistema llamado Acceso Concurrente Multiversión o MVCC por sus siglas en inglés permite a cada transacción tener acceso a las tablas sin interbloqueos. Cada proceso tiene acceso al último commit que se hizo sobre la tabla, de forma que no hay bloqueos entre procesos que quieren leer y los que quieren escribir, manteniendo el estándar ACID de una manera muy eficiente.
Replicación. Incluye replicación binaria basada en el envío de los cambios a los nodos de replica de forma asíncrona, permitiendo ejecutar consultas de solo lectura. Con esto se divide el tráfico entre los nodos de forma eficiente.
Por otro lado también incluye replicación síncrona que garantiza que para cada transacción de escritura, el nodo maestro espera hasta que al menos uno de los nodos de réplica haya escrito los datos en su registro de transacciones. De esta forma se evita tener que especificar la durabilidad de una transacción como ocurre con otras bases de datos que esperan a la confirmación de la transacción de forma síncrona.Datos definidos por el usuario. PostgreSQL permite la creación de agregaciones, tipos, funciones y operadores definidos por el usuario.
Agregaciones. Una función de agregación relaciona uno o más valores de una columna para hacer una operación con ellos y devuelve un único valor. Hay funciones de agregación que proporciona PostgreSQL como SUM o COUNT.
Las operaciones de agregación utilizan una variable de estado que es actualizada en cada fila procesada. Para definir una función de agregación se selecciona un tipo de dato para la variable de estado, un valor inicial de estado y una función de transición
{"postgreSQL"|cite}}
Tipos. Se pueden crear nuevos tipos de datos que se pueden utilizar como valor de un campo en una tabla. Para crear estos nuevos tipos se puede utilizar un lenguaje de programación de bajo nivel. Normalmente se usa C.
Los tipos definidos por el usuario deben tener una función de entrada y otra de salida. Con esto se determina cómo se muestra en un String y cómo se organiza el tipo en la memoria. [...] Una vez definido el tipo, se pueden declarar funciones para proporcionar operaciones con este tipo.
{"postgreSQL"|cite}}
Operadores. Un operador se utiliza para encapsular la llamada a una función. Se pueden sobrescribir operadores o crear operadores nuevos.
Un operador recubre la llamada a una función que es la que realmente realiza el trabajo. Para poder crear un operador primero hay que crear la función asociada.
{"postgreSQL"|cite}}
Características avanzadas. PostgreSQL ofrece más características para simplificar la gestión de los datos:
Vistas. Son combinaciones de tablas que se pueden utilizar para evitar tener que escribir consultas grandes con muchos joins cada vez que se quieran consultar esos datos. Las vistas se mantienen actualizadas y se pueden cambiar a medida que la base de datos evoluciona.
Transacciones. Funcionan de la misma forma que en cualquier base de datos: se recogen varias operaciones en una, de forma que o se ejecutan todas o no se ejecuta ninguna.
Funciones de ventana. Realiza cálculos en un conjunto de filas de una tabla que están relacionados con la fila actual. Funciona de forma similar a una función agregada con la diferencia de que no agrupa el resultado en una única fila.
Herencia. Es un concepto de programación orientada a objetos. Permite que una tabla herede todas las columnas de su columna padre sin tener que actualizar varias tablas o extraer consultas de varias tablas. En PostgreSQL versión 9.3 hay una restricción en su uso:
Aunque la herencia frecuentemente es útil, aún no ha sido integrada con restricciones unique o claves foráneas, lo que limita su utilidad.
{"postgreSQL"|cite}}
Tipos de datos. Soporta una gran variedad de tipos de datos de forma nativa:
Boolean
Números de precisión arbitraria
Texto ilimitado
Arrays
Direcciones IP
Direcciones MAC
Figuras geométricas
JSON y JSONB
Desarrollo y programación. Proporciona funciones y procedimientos en varios lenguajes de programación como Perl, Python, pgSQL que es muy similar al SQL de Oracle y más. Además está disponible para Linux y UNIX en todas sus variantes y para Windows de 32 o 64 bits.
APIs. Proporciona APIs de desarrollo para múltiples lenguajes de programación, de entre los que destacan Java, Node.js, OLEDB, Python, PHP, Go, Erlang...
Los principales límites en tamaños de PostgreSQL son los siguientes:
Límite | Valor |
---|---|
Tamaño máximo de base de datos | Ilimitado (Depende del sistema de almacenamiento) |
Tamaño máximo de tablas | 32 TB |
Tamaño máximo de filas | 1,6 TB |
Tamaño máximo de campos | 1 GB |
Número máximo de filas por tabla | Ilimitado |
Número máximo de columnas por tabla | 250 - 1600 (dependiendo del tipo) |
Número máximo de índices por tabla | Ilimitado |
Límites en PostgreSQL [8]
5.3 Indexación
La indexación es un método que mejora el rendimiento de la base de datos. Con la indexación el SGBD es capaz de buscar y devolver filas especificas mucho más rápido, pero no son todo ventajas:
Con la indexación se añade una sobrecarga al sistema de base de datos como un todo, por lo que debe usarse con cuidado.
{"postgreSQL"|cite}}
PostgreSQL proporciona varios tipos de índices:
B-trees. Estos índices son los que se usan por defecto. Pueden manejar consultas de rango e igualdad que están ordenadas, ademas de extraer datos ordenados de una cierta forma. No siempre es tan rápido como una búsqueda y ordenado pero puede ser útil en algunos casos.
Hash. Estos índices solo pueden manejar comparaciones de igualdad simples usando el operador "=". PostgreSQL desaconseja el uso de estos índices por el siguiente motivo:
Los cambios en los índices hash no se replican mediante streaming o por replicación basada en ficheros búsqueda de un backup por lo que pueden dar respuestas incorrectas en las consultas posteriores.
{"postgreSQL"|cite}}
GiST. Estos son una generalización de los árboles B+. PostgreSQL utiliza estos para varios tipos de datos geométricos bidimensionales, por lo que son capaces de optimizar las consultas de "vecino más cercano" en la que busca el punto más cercano a un punto dado.
SP-GiST. Indexa igual que los índices GiST y además:
Permite la implementación de varias estructuras de datos no balanceadas: Árboles k-d, árboles uad y árboles radix.
{"postgreSQL"|cite}}
GIN. Son índices invertidos que pueden manejar valores con másde una clave, como los arrays.
Estos tres últimos índices soportan estrategias de indexación definidas por el usuario, por lo que son índices adecuados para la indexación de objetos creados por el usuario.