Ejecute PostgreSQL solo en la memoria

Bilal Shahid 20 junio 2023
  1. Introducción a la base de datos en memoria
  2. Compatibilidad con PostgreSQL usando una base de datos en la memoria o no
Ejecute PostgreSQL solo en la memoria

Las bases de datos que creamos se almacenan en la memoria permanente del disco duro o SSD (Solid State Drive).

Sin embargo, esta memoria es más lenta que la RAM (memoria de acceso aleatorio). Por lo tanto, a veces creamos y usamos una base de datos en RAM llamada memoria para hacerla más eficiente y rápida.

Este artículo analiza cómo podemos usar una base de datos en memoria en PostgreSQL. Sin embargo, primero, estudiemos qué significa ejecutar una base de datos en memoria y cómo otras plataformas lo permiten.

Introducción a la base de datos en memoria

Una base de datos en memoria (IMDB) es una base de datos que se almacena y ejecuta en la memoria RAM o principal de la computadora en lugar de en la unidad de disco. Se hace para generar un rendimiento más eficiente y rápido, ya que la recuperación de datos de la memoria principal requiere menos instrucciones en la CPU.

Por lo tanto, dichas bases de datos se utilizan principalmente en sistemas de tiempo real y aplicaciones de juegos, ya que requieren un tiempo de respuesta rápido.

Esta velocidad está garantizada porque no implica traducción ni encriptación de los datos. De esta manera, los datos se mantienen en un formulario listo para usar directamente, lo que resulta en un tiempo de respuesta más rápido.

Una desventaja de usar una base de datos en la memoria es que la RAM es volátil. Además, dado que la RAM no es una solución de almacenamiento permanente, perderemos los datos si se interrumpe la alimentación o si la base de datos o el servidor fallan.

Sin embargo, se utilizan tecnologías como la memoria flash y la memoria de acceso aleatorio no volátil (NVRAM) para contrarrestar esta volatilidad de las bases de datos en memoria. Además, muchas plataformas SQL admiten bases de datos en memoria.

Por ejemplo, SQL Server admite la ejecución de una base de datos en la memoria porque tiene In-Memory OLTP. En SQL Server, puede almacenar una tabla en la memoria creándola WITH (MEMORY_OPTIMIZED = ON) o comandos similares.

Pero el punto notable es ¿puedes hacerlo en PostgreSQL? Este artículo incluye la respuesta a esta pregunta.

Compatibilidad con PostgreSQL usando una base de datos en la memoria o no

Desafortunadamente, PostgreSQL no admite el uso de una base de datos o cualquiera de sus componentes en la memoria. La razón principal es que PostgreSQL está implementado en C, un lenguaje compilado.

Sin embargo, ejecutar una base de datos en la memoria es una cualidad beneficiosa, que se usa principalmente en pruebas unitarias para acelerar los resultados. Entonces, ¿cómo hacen esto los desarrolladores en PostgreSQL si no existe soporte de base de datos en memoria?

Veremos algunas alternativas en este artículo. Una forma de hacer esto es crear espacios de tabla. Veamos cuáles son y si son una buena alternativa o no.

Usar TABLESPACE en PostgreSQL

Un tablespace en PostgreSQL es un objeto de base de datos cuya ubicación puede ser definida por el administrador de la base de datos durante la creación. El tablespace ayuda a asignar ubicaciones de memoria de acuerdo con las necesidades de eficiencia de los datos.

Por ejemplo, podemos usar tablespace para almacenar tablas a las que se accede con frecuencia en una memoria más rápida, como SSD, y datos menos necesarios en una memoria más lenta, como discos duros.

De manera similar, podemos usar tablespace para almacenar algunos datos en la RAM, lo que nos permite el mismo efecto que usar una base de datos en la memoria. La sintaxis para crear tablespaces es la siguiente:

CREATE TABLESPACE tablespace_name LOCATION '/ssd/postgresql/data';

Después de la palabra clave LOCATION, añadimos el enlace simbólico de la dirección donde queremos crear el tablespace. Sin embargo, no se recomienda el uso de tablespaces en memoria en PostgreSQL. Incluso se agrega como advertencia en la documentación oficial de PostgreSQL.

Debido a la volatilidad de la RAM, todos los datos en el clúster de la base de datos se volverán ilegibles si pierde su tablespace debido a fallas del sistema o eliminación accidental. Por lo tanto, usar un tablespace en la memoria no es una buena práctica.

Entonces, ¿qué opciones nos deja? Primero, veamos otra alternativa que podemos considerar: crear una instancia de PostgreSQL descartable para tiempos de respuesta más rápidos.

Crear una instancia desechable de PostgreSQL

Para comprender este método, consideremos el ejemplo de las pruebas unitarias.

Probar una base de datos requiere una velocidad de rendimiento rápida y eficiente. Una forma de hacer esto en PostgreSQL es crear una instancia desechable de PostgreSQL que se eliminará después de su uso.

Este método requiere el uso del comando initdb para crear un nuevo clúster de base de datos en PostgreSQL. Un clúster de base de datos es un grupo de bases de datos que se ejecutan en el mismo servidor.

La sintaxis del comando initdb es la siguiente:

initdb [option...] [ --pgdata | -D ] directory

Un ejemplo de cómo podemos usar este comando, crear un nuevo clúster de base de datos, como se muestra en la siguiente consulta:

initdb --auth=trust --username=postgres -D /path/to/temp/datadir

Este comando ayuda a crear un clúster de base de datos de almacenamiento temporal. Además, otorga confianza a la base de datos predeterminada postgres.

Ahora, debe conectarse al clúster de base de datos creado como el usuario postgres especificado en la consulta anterior. Después de esto, es hora de que ejecutes los comandos de creación, como CREAR USUARIO o CREAR BASE DE DATOS, y luego entregues tu código a las pruebas unitarias.

Después de completar las pruebas, usará el comando pg_ctl para detener el servidor y eliminar el directorio de datos datadir. Este proceso permitirá tiempos de respuesta más rápidos durante las pruebas, similar a ejecutar una base de datos en la memoria.

Por lo tanto, podemos concluir que PostgreSQL no admite el uso de una base de datos en memoria, a diferencia de SQL Server o MySQL.

Podemos crear un tablespace en la memoria especificando su ubicación en la RAM, pero eso no se recomienda ya que puede causar una pérdida de datos grave, que puede requerir mucho esfuerzo para revertir.

Para acelerar el tiempo de respuesta en PostgreSQL para las pruebas, podemos crear una instancia desechable de PostgreSQL y configurarla en consecuencia. Esperamos haber podido aclararte estos conceptos. ¡Seguir aprendiendo!

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub