Después de un año de desarrollo, se ha publicado una nueva rama estable de la base de datos PostgreSQL 18. Las actualizaciones para esta nueva rama se lanzarán durante cinco años hasta noviembre de 2030. El soporte para PostgreSQL 13.x, la rama más antigua que se sigue apoyando, finalizará el 13 de noviembre.
Novedades principales:
- Se ha añadido un subsistema de entrada/salida asíncrono que permite aumentar la capacidad de entrada/salida y eliminar latencias. Además de la implementación universal de AIO (io_method=worker) disponible en todas las plataformas, que se basa en la ejecución de múltiples procesos manejadores (por defecto 3), en Linux se puede utilizar la interfaz de entrada/salida asíncrona io_uring (io_method=io_uring), que está soportada desde el núcleo de Linux 5.1. La entrada/salida asíncrona se utiliza actualmente solo para acelerar la ejecución de algunas operaciones relacionadas con la lectura de datos del sistema de archivos, como la iteración secuencial, el escaneo de mapas de índices y la limpieza (vacuum). En algunas pruebas, el uso de AIO ha llevado a un aumento de rendimiento de 2 a 3 veces. Las operaciones de escritura siguen realizándose de manera sincrónica para cumplir con los requisitos ACID.
- Se ha implementado la optimización "skip scan" en índices de múltiples columnas, lo que permite que el índice se utilice no solo para verificar la primera columna indexada y la combinación completa de columnas, sino también para procesar de forma individual las demás columnas indexadas. Por ejemplo, anteriormente, al crear un índice B-tree sobre las columnas "(status, date)", el índice solo se aplicaba a las consultas que verificaban el campo "status" o ambos campos "status" y "date", y al verificar en la consulta solo el campo "date", se realizaba un escaneo del contenido de la tabla. El modo "skip scan" permite en ciertas situaciones escanear el índice cuando se consulta solo el campo "date". Este modo se aplica únicamente a índices "B-tree" cuando se utiliza un operador condicional "=" sobre el campo indexado en las consultas, en situaciones donde el campo omitido tiene un número limitado de valores distintos (por ejemplo, la optimización funcionará si el campo de estado "status" tiene varios valores fijos).
- Se han añadido optimizaciones que utilizan más eficazmente los índices para las consultas que contienen las construcciones «OR» e «IN (…)» en la cláusula «WHERE», así como mejoras en el rendimiento de la planificación y ejecución de uniones de tablas (por ejemplo, se ha acelerado el código de fusión de hashes y se ha permitido utilizar ordenación incremental al fusionar tablas).
- Se ha añadido soporte para la paralelización de la construcción de índices GIN (Índice Invertido Generalizado), que se utilizan para indexar valores compuestos, como arreglos, y para organizar la búsqueda en datos de texto completo o en estructuras JSON.
- Se ha añadido la capacidad de crear vistas materializadas y claves para la partición de tablas con índices que tienen la característica de «único», sin utilizar la estructura B-tree.
- Se ha mejorado el rendimiento general de los bloqueos para consultas que interactúan con un gran número de tablas, así como se han implementado mejoras en el procesamiento de consultas a tablas particionadas, haciendo que el filtrado de secciones no utilizadas y las operaciones de unión (JOIN) sean más rápidas.
- Se han acelerado las operaciones con texto, como las funciones que cambian a mayúsculas/minúsculas. Se ha añadido el modo PG_UNICODE_FAST para acelerar el manejo de las propiedades de la localización de caracteres Unicode.
- Se ha implementado la capacidad de guardar estadísticas del planificador de consultas después de una actualización entre versiones significativas de PostgreSQL. Este cambio permite evitar la ejecución de la costosa operación «ANALYZE» tras iniciar una nueva versión, durante la cual se experimenta una caída en el rendimiento de la base de datos.
- Se ha mejorado el rendimiento de la utilidad pg_upgrade, utilizada para automatizar la transición a una nueva versión significativa de PostgreSQL. Las optimizaciones son especialmente notables al actualizar bases de datos que contienen un gran número de objetos, como tablas y secuencias. Para acelerar el funcionamiento de pg_upgrade, también se ha añadido la opción «—jobs N» para paralelizar verificaciones en N hilos y la opción «—swap» para reemplazar directorios de datos completamente sin enlaces simbólicos, sin clonaciones y sin copias de archivos.
- Se ha añadido soporte para columnas generadas virtualmente, cuyos valores se calculan al vuelo durante la ejecución de consultas, sin guardar en disco. Si en la expresión «CREATE TABLE…» para columnas generadas se indica únicamente la palabra clave «GENERATED» sin especificar el tipo (STORED o VIRTUAL), entonces se aplica la nueva variante por defecto en lugar de la implementación anterior. En la implementación antigua, los valores se generaban durante las operaciones de «INSERT» o «UPDATE» y se guardaban en disco para su posterior uso. La desventaja de las columnas generadas virtualmente es la imposibilidad de utilizarlas en índices, y su ventaja es la capacidad de realizar normalización y modificación de datos al vuelo (lo cual es relevante al trabajar con datos JSON). En cuanto a las columnas generadas almacenadas clásicas, en la nueva versión se ha garantizado soporte para la replicación lógica.
- En los comandos INSERT, UPDATE, DELETE y MERGE se ha implementado la capacidad de devolver valores antiguos (OLD) y actuales (CURRENT) en la expresión RETURNING. Por ejemplo, «UPDATE… RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.»
- Se ha añadido la función uuidv7() para generar identificadores únicos aleatorios en formato UUIDv7. A diferencia de la antigua función para generar UUID (gen_random_uuid), que ahora está disponible adicionalmente con el nombre uuidv4(), en UUIDv7 se incluye, además del valor aleatorio, el tiempo de generación. La existencia de partes ordenadas en el valor UUID (los primeros 12 caracteres son tiempo epoch, y los siguientes 18 son valor aleatorio) mejora la eficiencia de clasificación e indexación, lo cual es relevante ya que los UUID se utilizan comúnmente como claves primarias (por ejemplo, las claves creadas en tiempos cercanos se colocan juntas en el índice).
- En la operación «LIKE» se ha implementado soporte para coincidencias de texto que utilizan propiedades no deterministas de la configuración regional «collation», permitiendo realizar coincidencias teniendo en cuenta el significado de los caracteres (por ejemplo, al comparar puede no tenerse en cuenta el acento). Se ha añadido la función CASEFOLD para modificar el registro de los caracteres teniendo en cuenta las propiedades de la configuración regional «collation» (por ejemplo, algunos caracteres tienen más de dos variantes en minúsculas o al comparar requieren convertirse a mayúsculas, en vez de a minúsculas).
- Se ha añadido la posibilidad de utilizar restricciones temporales (temporal constraint). En los valores 'PRIMARY KEY' y 'UNIQUE', para añadir restricciones temporales se debe usar la expresión 'WITHOUT OVERLAPS', mientras que para 'FOREIGN KEY' se debe utilizar la expresión PERIOD. Por ejemplo, al definir claves primarias, se pueden restringir las claves con intervalos de tiempo que se superponen.
- Se ha añadido el comando 'CREATE FOREIGN TABLE … LIKE command' para crear un esquema de tabla externa basado en la definición de una tabla local.
- Se ha añadido soporte para conectarse a bases de datos utilizando autenticación basada en OAUTH 2.0 con el uso de tokens de acceso en lugar de contraseñas. El uso de OAUTH permite no almacenar contraseñas en la base de datos, identificar a los usuarios a través de servicios externos y aprovechar capacidades como la autenticación de dos factores y el inicio de sesión único (SSO).
- Se ha añadido la función ssl_tls13_ciphers(), que permite determinar la lista de algoritmos de cifrado permitidos al conectar utilizando el protocolo TLSv1.3.
- Se ha clasificado como obsoleto y se planea eliminar el soporte para autenticación utilizando el algoritmo md5 para el hash de contraseñas. En lugar de md5, se recomienda usar el algoritmo SCRAM (SCRAM-SHA-256), que apareció en PostgreSQL 10. Además, se destaca la implementación del soporte para el paso de autenticación basado en SCRAM al conectarse a servidores PostgreSQL externos a través de postgres_fdw y dblink.
- Al realizar la operación 'EXPLAIN ANALYZE', se proporciona información sobre el número de operaciones de búsqueda en índices al escanear el índice y el número de accesos a buffers durante la ejecución de la consulta. En la salida de 'EXPLAIN ANALYZE VERBOSE', se incluye estadísticas sobre el CPU, el registro WAL y la intensidad de las operaciones de lectura. En la tabla pg_stat_all_tables se ha añadido información sobre el tiempo dedicado a la operación VACUUM y el análisis de tablas. Se proporciona estadísticas sobre la intensidad de entrada/salida y la carga en el registro WAL desglosadas por conexiones individuales. En pg_stat_subscription_stats y en los registros se ha añadido información de diagnóstico sobre conflictos durante las operaciones de escritura durante la replicación lógica.
- En las nuevas instalaciones, se ha habilitado por defecto el uso de sumas de comprobación para verificar la integridad de los datos almacenados. Para anular este comportamiento al iniciar initdb, se debe especificar la opción '--no-data-checksums'.
- Se ha añadido la bandera «—all» a la utilidad pg_createsubscriber para crear réplicas lógicas de un comando para todas las bases de datos a la vez.
- Se ha implementado una nueva versión (3.2) del protocolo utilizado para la interacción de herramientas externas con el SGBD, que se ha implementado en la biblioteca libpq. La última actualización del protocolo se realizó en PostgreSQL 7.4 (año 2003). En la biblioteca libpq, por defecto, se sigue utilizando la versión 3.0.
Fuente: opennet.ru
