30.1. ¿Qué es la compilación JIT? #

30.1.1. Operaciones aceleradas por JIT
30.1.2. Integración en línea (Inlining)
30.1.3. Optimización

La compilación en tiempo de ejecución (Just-in-Time, JIT) es el proceso de convertir alguna forma de evaluación de programa interpretado en un programa nativo, y hacerlo en tiempo de ejecución. Por ejemplo, en lugar de usar código de propósito general que puede evaluar expresiones SQL arbitrarias para evaluar un predicado SQL particular como WHERE a.col = 3, es posible generar una función que sea específica para esa expresión y que la CPU pueda ejecutar de forma nativa, lo que produce una aceleración.

PostgreSQL tiene soporte integrado para realizar compilación JIT utilizando LLVM cuando PostgreSQL se compila con --with-llvm.

Consulta src/backend/jit/README para obtener más detalles.

30.1.1. Operaciones aceleradas por JIT #

Actualmente, la implementación de JIT de PostgreSQL cuenta con soporte para acelerar la evaluación de expresiones y la deformación de tuplas (tuple deforming). Varias otras operaciones podrían ser aceleradas en el futuro.

La evaluación de expresiones se utiliza para evaluar cláusulas WHERE, listas de objetivos (target lists), agregaciones y proyecciones. Se puede acelerar generando código específico para cada caso.

La deformación de tuplas (tuple deforming) es el proceso de transformar una tupla en disco (ver la Section 66.6.1) en su representación en memoria. Se puede acelerar creando una función específica para el diseño de la tabla y el número de columnas a extraer.

30.1.2. Integración en línea (Inlining) #

PostgreSQL es muy extensible y permite definir nuevos tipos de datos, funciones, operadores y otros objetos de base de datos; consulta la Chapter 36. De hecho, los objetos integrados se implementan utilizando casi los mismos mecanismos. Esta extensibilidad implica cierta sobrecarga, por ejemplo, debido a las llamadas a funciones (ver la Section 36.3). Para reducir esa sobrecarga, la compilación JIT puede integrar en línea (inline) los cuerpos de funciones pequeñas en las expresiones que las utilizan. Eso permite optimizar y eliminar un porcentaje significativo de la sobrecarga.

30.1.3. Optimización #

LLVM tiene soporte para optimizar el código generado. Algunas de las optimizaciones son lo suficientemente baratas como para realizarse siempre que se use JIT, mientras que otras solo son beneficiosas para consultas de larga duración. Consulta https://llvm.org/docs/Passes.html#transform-passes para obtener más detalles sobre las optimizaciones.