La compilation à la volée (ou JIT pour
Just-in-Time Compilation) est le processus
de transformation de l'évaluation d'un programme interprété en un programme
natif, et ce pendant l'exécution. Par exemple, au lieu d'utiliser un code
généraliste pouvant évaluer des expressions SQL arbitraires pour évaluer un
prédicat SQL particulier comme WHERE a.col = 3
, il est
possible de générer une fonction spécifique à cette expression et qui peut
être exécutée nativement par le CPU, apportant une accélération.
PostgreSQL sait procéder à une compilation
JIT grâce à
LLVM
s'il a été compilé avec
--with-llvm
(voir --with-llvm
).
Consultez src/backend/jit/README
pour plus de détails.
Actuellement, l'implémentation JIT de PostgreSQL supporte l'accélération de l'évaluation d'expression et du décodage d'enregistrement. Plusieurs autres opérations pourraient être accélérées dans le futur.
L'évaluation d'expression est utilisée pour évaluer les clauses
WHERE
, les listes de colonnes, les agrégats et les projections.
Elle peut être accélérée en générant du code spécifique à chaque cas.
Le décodage d'enregistrement est le processus de transformation d'un enregistrement sur disque (voir Section 73.6.1) dans sa représentation en mémoire. Il peut être accéléré en créant une fonction spécifique au format de la table et au nombre de colonnes extraites.
PostgreSQL est très extensible et permet de définir de nouveaux types de données, fonctions, opérateurs et autres objets de base de données ; voir Chapitre 38. En fait, ceux intégrés sont implémentés avec à peu près les mêmes mécanismes. Cette extensibilité a un surcoût, par exemple à cause des appels de fonction (voir Section 38.3). Pour réduire ce surcoût, la compilation JIT peut intégrer le corps des petites fonctions dans les expressions qui les utilisent. Cela permet d'optimiser un pourcentage significatif du surcoût.
LLVM permet d'optimiser le code généré. Certaines optimisations sont suffisamment peu coûteuses pour être accomplies à chaque utilisation du JIT, alors que d'autres n'ont de bénéfice que pour les requêtes durant plus longtemps. Voir pour plus de détails sur les optimisations.