Aumentar el rendimiento de SQLite

Recientemente he usado SQLite en uno de mis proyectos, y me he encontrado con el problema de la falta de rendimiento. La ejecución de múltiples operaciones INSERT / UPDATE / DELETE era muy lenta, así que me puse a investigar sobre el tema.

El problema radica en que SQLite inicia automáticamente una transacción antes de ejecutar cualquier instrucción DML y la confirma después de cada ejecución. En consecuencia, al ejecutar varias instrucciones consecutivas, se iniciará y confirmará una nueva transacción para cada instrucción.

La solución a este problema es bastante simple: incluir todas las intrucciones dentro de una sola transacción BEGIN… END ( https://www.sqlite.org/lang_transaction.html ). En este caso se iniciará una sola transacción antes de la ejecución del bloque completo y se confirmará después de todas las modificaciones.

Esta no es la única manera de aumentar el rendimiento en SQLite. También podemos configurar los parámetros de la base de datos utilizando las declaraciones de PRAGMA (https://www.sqlite.org/pragma.html). Los parámetros de SQLite no están orientados a un alto rendimiento de forma predeterminada, sino a la máxima seguridad e integridad de los datos. La modificación de estos parámetros puede aumentar el rendimiento, a costa del aumento del riesgo de de corrupción de los datos.

PRAGMA SYNCHRONOUS = OFF
De forma predeterminada, SQLite hace una pausa después de enviar un comando de escritura a nivel sistema operativo. Esto garantiza que los datos se escriben en el disco. Al configurar synchronous = OFF , estamos indicando a SQLite que simplemente transfiera los datos al sistema operativo para que los escriba y luego continúe sin esperar a que se confirme la escritura de los datos por parte del sistema operativo. Esto hace que exista la posibilidad de que el archivo de la base de datos se corrompa si la computadora sufre un bloqueo catastrófico (o un fallo eléctrico).

Esto provoca un aumento significativo del rendimiento en Windows. Se recomienda acelerar el rendimiento de esta manera sólo si estamos seguros de la estabilidad del sistema operativo y del suministro de energía.

Aquí tenemos un ejemplo de como configurar pragma synchronous = off

<?php
    
    // Creamos la conexion a la base de datos
    try {
        
        $conn = new PDO('sqlite:D:\Proyectos\basededatos.db3');
        // Para mostrar los errores
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Para acelerar el rendimiento de sqlite
        $conn->exec('pragma synchronous = off;');

    } catch (PDOException $e) {
        echo "¡Error!: " . $e->getMessage() . "<br/>";
        die();
    }

?>

Deja un comentario

Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM