Comparer les performances de requêtes SQL
J’ai réalisé un petit programme en Rust, sqlstopwatch, pour comparer les performances de différentes requêtes SQL. J’ai été inspiré par l’article Benchmarking SQL publié par le projet jOOQ, dans lequel le code du test est implémenté en SQL. Je voulais quelque chose de semblable, mais j’avais quelques exigences supplémentaires :
- Un programme en ligne de commande avec une interface utilisateur simple en mode texte (TUI) qui affiche une barre de progression.
- Le programme devrait prendre en charge PostgreSQL, MySQL et SQLite.
- Il devrait lire les requêtes SQL et les paramètres du test dans un fichier de configuration indiqué sur la ligne de commande.
- Il devrait afficher les résultats sous forme de table dans le terminal ou les enregistrer dans un fichier au format CSV que je puisse utiliser pour générer un diagramme.
L’interface utilisateur a été facile à réaliser avec Ratatui. Pour interagir avec la base de données, j’ai utilisé la bibliothèque asynchrone sqlx, qui fournit une bibliothèque SQLite embarquée.
J’ai pensé à utiliser le format TOML pour le fichier de
configuration, mais le fichier doit fournir les identifiants de connexion. Dans
les environnements de test, il se peut que les identifiants doivent être
chargés à partir de variables d’environnement ou de fichiers sur un système de
fichiers monté, mais TOML ne permet pas d’effectuer de telles opérations. Par
conséquent, il vaut mieux que le fichier de configuration soit un programme dans
un langage de script. Mon exercice d’implémentation d’un interpréteur de
langage de script m’avait permis d’apprécier à sa juste valeur la
machine virtuelle Lua. Le fichier de configuration est
donc un script en Lua, que je trouve plus commode de rédiger en
Fennel, un dialect de Lisp qui se compile en Lua.
Grâce à la bibliothèque mlua, il a été très
facile d’embarquer un interpréteur Lua dans le programme et d’utiliser
Serde pour convertir des tables Lua en structs Rust.
Maintenant je peux me remettre à me pencher sur mes requêtes SQL.