実行時(JIT)コンパイルとは、ある形式のインタプリタプログラムの評価をネイティブプログラムに変換する過程であり、かつそれを実行時に行うことを指します。
たとえば、WHERE a.col = 3
のような特定のSQL述語を評価するために、任意のSQL式を評価できる汎用目的のコードを使う代わりに、その式専用の関数を生成し、CPUによってネイティブに実行して速度向上をもたらすことができます。
PostgreSQLが--with-llvm
でビルドされている場合、PostgreSQLにはLLVMを使ってJITコンパイルを実行するためのサポートが組み込まれます。
さらなる詳細はsrc/backend/jit/README
をご覧ください。
今の所、PostgreSQLのJIT実装は、式評価とタプルデフォーミング(tuple deforming)の高速化をサポートしています。 将来は他の操作も高速化されるかも知れません。
式評価は、WHERE
句、ターゲットリスト、集約、射影を評価するために使用されます。
それぞれのケースに応じたコードを生成することによって高速化することができます。
タプルデフォーミングは、ディスク上のタプル(70.6.1参照)をメモリ上の表現に変換する処理です。 これはテーブルレイアウトと抽出するカラム数に特化した関数を作ることによって高速化可能です。
PostgreSQLは拡張性が高く、新しいデータ型、関数、演算子、その他のデータベースオブジェクトを定義することが可能です。 第38章を参照してください。 実際、組み込みオブジェクトは似た機構を使って実装されています。 この拡張性は、たとえば関数呼び出し(38.3参照)により、幾分のオーバーヘッドをもたらします。 このオーバーヘッドを軽減するために、JITコンパイルは、小さな関数の本体をそれを使っている式にインライン展開することができます。 これにより、オーバーヘッドのかなりの部分を最適化によって解消することができます。
LLVMは、生成したコードの最適化をサポートしています。 ある最適化はJITが使用される際に常に適用できるほど安価ですが、長時間実行する問い合わせのときだけ有利になるようなものもあります。 最適化についてのさらなる詳細は、https://llvm.org/docs/Passes.html#transform-passesをご覧ください。