30.1. ЧÑо Ñакое JIT-компилÑÑиÑ? #
JIT-компилÑÑÐ¸Ñ (Just-In-Time compilation, ÐомпилÑÑÐ¸Ñ Â«ÑоÑно в нÑжное вÑемÑ») â ÑÑо пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑа пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½ÑеÑпÑеÑиÑÑемого ваÑианÑа иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° ÑзÑке пÑоÑеÑÑоÑа. ÐапÑимеÑ, вмеÑÑо иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑнивеÑÑалÑного кода, ÑпоÑобного вÑÑиÑлÑÑÑ Ð¿ÑоизволÑнÑе SQL-вÑÑажениÑ, Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE a.col = 3 можно ÑгенеÑиÑоваÑÑ ÑÑнкÑиÑ, пÑедназнаÑеннÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ð´Ð»Ñ ÑÑого вÑÑажениÑ, коÑоÑÑÑ ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пÑоÑеÑÑоÑ, Ñак ÑÑо она бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð±ÑÑÑÑее.
Ð Postgres Pro поддеÑжка JIT-компилÑÑии Ñ Ð¸ÑполÑзованием LLVM вклÑÑаеÑÑÑ Ð¿Ñи ÑбоÑке Postgres Pro Ñ ÐºÐ»ÑÑом --with-llvm.
30.1.1. ÐпеÑаÑии, ÑÑкоÑÑемÑе Ñ Ð¿Ñименением JIT #
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑеализаÑÐ¸Ñ JIT в Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑкоÑение вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÑажений и пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑÑежей. РбÑдÑÑем могÑÑ Ð±ÑÑÑ ÑÑкоÑÐµÐ½Ñ Ð¸ некоÑоÑÑе дÑÑгие опеÑаÑии.
ÐÑÑиÑление вÑÑажений пÑоизводиÑÑÑ Ð¿Ñи обÑабоÑке пÑедложений WHERE, ÑелевÑÑ
ÑпиÑков, агÑегаÑов и пÑоекÑий. Ðно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑкоÑено в ÑезÑлÑÑаÑе генеÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð°, пÑедназнаÑенного Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ конкÑеÑного ÑлÑÑаÑ.
ÐÑеобÑазование коÑÑежей â пÑоÑедÑÑа пеÑевода коÑÑежа Ñ Ð´Ð¸Ñка (Ñм. ÐодÑаздел 70.6.1) в ÑазвÑÑнÑÑое пÑедÑÑавление в памÑÑи. Ðго можно ÑÑкоÑиÑÑ, Ñоздав ÑÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнной ÑÑÑÑкÑÑÑÑ ÑаблиÑÑ Ð¸ колиÑеÑÑва извлекаемÑÑ ÑÑолбÑов.
30.1.2. ÐÑÑÑаивание #
СУÐÐ Postgres Pro оÑÐµÐ½Ñ Ð³Ð¸Ð±ÐºÐ° и позволÑÐµÑ Ð¾Ð¿ÑеделÑÑÑ Ð½Ð¾Ð²Ñе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , ÑÑнкÑии, опеÑаÑоÑÑ Ð¸ дÑÑгие обÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ; Ñм. ÐлавÑ 37. РдейÑÑвиÑелÑноÑÑи вÑÑÑоеннÑе обÑекÑÑ ÑеализÑÑÑÑÑ Ð¿ÑакÑиÑеÑки Ñеми же Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð°Ð¼Ð¸. С ÑÑой гибкоÑÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе издеÑжки, напÑимеÑ, ÑопÑÑÑÑвÑÑÑие вÑзовам ÑÑнкÑий (Ñм. Раздел 37.3). ÐÐ»Ñ ÑокÑаÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ Ð¸Ð·Ð´ÐµÑжек JIT-компилÑÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑаиваÑÑ Ñела маленÑÐºÐ¸Ñ ÑÑнкÑий в код вÑÑажений, иÑполÑзÑÑÑÐ¸Ñ Ð¸Ñ . ÐÑо позволÑÐµÑ ÑопÑимизиÑоваÑÑ Ð·Ð½Ð°ÑиÑелÑнÑй пÑоÑÐµÐ½Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ Ð¸Ð·Ð´ÐµÑжек.
30.1.3. ÐпÑимизаÑÐ¸Ñ #
Ð LLVM поддеÑживаеÑÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ ÑгенеÑиÑованного кода. ÐекоÑоÑÑе опÑимизаÑии Ð¾Ð±Ñ Ð¾Ð´ÑÑÑÑ Ð´Ð¾ÑÑаÑоÑно дÑÑево и могÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи иÑполÑзовании JIT в лÑбом ÑлÑÑае, Ñогда как дÑÑгие опÑÐ°Ð²Ð´Ð°Ð½Ñ ÑолÑко пÑи длиÑелÑнÑÑ Ð·Ð°Ð¿ÑоÑÐ°Ñ . ÐодÑобнее об опÑимизаÑии ÑаÑÑказÑваеÑÑÑ Ð² https://llvm.org/docs/Passes.html#transform-passes.