powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / jit компиляция, timing и скорость выполнения запроса
5 сообщений из 5, страница 1 из 1
jit компиляция, timing и скорость выполнения запроса
    #40038745
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

при выполнении сложного запроса explain (analyze, buffers) выводит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
 Planning Time: 237.688 ms
 JIT:
   Functions: 7491
   Options: Inlining true, Optimization true, Expressions true, Deforming true
   Timing: Generation 790.588 ms, Inlining 105.173 ms,  Optimization 42506.513 ms, Emission 32586.621 ms, Total 75988.895 ms 
  Execution Time: 129877.829 ms 
(3913 строк)
Время: 130342,853 мс (02:10,343)

если выполнить
Код: sql
1.
set jit=off;


и повторить explain :

Код: plaintext
1.
2.
3.
4.
...
 Planning Time: 239.546 ms
  Execution Time: 54121.780 ms 
(3909 строк)
Время: 54568,092 мс (00:54,568)

получается что JIT компиляция никак не ускоряет запрос:
130342,853 (время выполнения) - 75988.895 (Total JIT) = 54354
это примерно время выполнения запроса без JIT.

Подскажите:
1. В JIT секции эксплайна что означают операции Optimization 42506.513 ms, Emission 32586.621 ms - это "оптимизации для улучшения сгенерированного кода" и что-то еще?
2. Как правильно выключить jit компиляцию для подобных запросов? поднять jit_..._cost`ы или просто бахнуть set jit=off?
...
Рейтинг: 0 / 0
jit компиляция, timing и скорость выполнения запроса
    #40038866
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, версия:
PostgreSQL 12.5 (Debian 12.5-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
...
Рейтинг: 0 / 0
jit компиляция, timing и скорость выполнения запроса
    #40038900
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111

Подскажите:
1. В JIT секции эксплайна что означают операции Optimization 42506.513 ms, Emission 32586.621 ms - это "оптимизации для улучшения сгенерированного кода" и что-то еще?
2. Как правильно выключить jit компиляцию для подобных запросов? поднять jit_..._cost`ы или просто бахнуть set jit=off?


1 - да.
2 - или оптом jit=off или в вашем случае может будет эффективнее jit_optimize_above_cost поднять до высокого значения чтобы оно именно оптимизацию не включало в этом конкретном случае.

PS: какой то у вас совсем сложный запрос... никогда не видел такие цифры на этапе jit optimization. Не приведете его?
Может там какой то очередной баг в jit вылезает...зп

PPS: аккуратнее с SET если у вас pgbouncer.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
jit компиляция, timing и скорость выполнения запроса
    #40038967
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

проблема оказалась в обращении к ключу секции партиционированной таблицы (партиций ~500) через скалярный запрос.
Код: sql
1.
2.
3.
SELECT *
   FROM t_part_tbl
  WHERE part_key = (select user_func() a )


(select ... было тупо перенесено из оракла - так гарантировалось что ф-я будет выполнена один раз, а не для каждой строки)

сделал компактный тест:

создание объектов:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
CREATE TABLE t_fn1 (
    g varchar(10) NOT NULL,
    nomer numeric(38) NOT NULL,
    "period" date NOT NULL DEFAULT '1900-01-01'::date,
    "text" varchar(80) NULL,
    textf varchar(4000) NULL,
    src varchar(80) NULL,
    status1 numeric(38) NOT NULL DEFAULT 0,
    status2 numeric(38) NULL,
    gr numeric(38) NULL,
    cuser numeric(38) NULL,
    cusera varchar(80) NULL,
    cdate timestamp NULL,
    muser numeric(38) NULL,
    musera varchar(80) NULL,
    mdate timestamp NULL,
    mdate2 timestamp NULL,
    parent numeric(38) NULL,
    priz varchar(7) NULL,
    res_code numeric(38) NULL,
    CONSTRAINT pk_t_fn1 PRIMARY KEY (g, nomer, period)
)
PARTITION BY LIST (g);

DO 
$$declare
begin
    for i in 1..500 loop
        execute 
            'CREATE TABLE t_fn1_p_fn'||i||' PARTITION OF t_fn1 FOR VALUES IN (''FN'||i||''')';
        insert into t_fn1 (g, nomer)
        select 'FN'||i, generate_series
        from generate_series(1, 1e3);
        commit;
    end loop;
END$$;

analyze t_fn1;

CREATE OR REPLACE VIEW f_fn1
AS SELECT *
   FROM t_fn1
  WHERE g::text = (select 'FN1'::text a );



тест1
Код: plaintext
1.
2.
3.
4.
5.
6.
set jit=on;
explain (analyze, buffers, Timing)
select *
  from f_fn1 c, f_fn1 d
 where c.nomer=d.nomer
;

получаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 ...
Planning Time: 506.677 ms
 JIT:
   Functions: 2010
   Options: Inlining true, Optimization true, Expressions true, Deforming true
   Timing: Generation 197.847 ms, Inlining 28.908 ms, Optimization 7116.737 ms, Emission 4270.661 ms, Total 11614.153 ms
  Execution Time: 11700.974 ms 
(2022 строки)
Время: 12242,993 мс (00:12,243)

тест2
Код: plaintext
1.
2.
3.
4.
5.
6.
set jit=off;
explain (analyze, buffers, Timing)
select *
  from f_fn1 c, f_fn1 d
 where c.nomer=d.nomer
;

получаем
Код: plaintext
1.
2.
3.
 Planning Time: 516.801 ms
  Execution Time: 65.896 ms 
(2018 строк)
Время: 612,580 мс

если поправить вьюху и убрать скаляр:
Код: sql
1.
2.
3.
4.
CREATE OR REPLACE VIEW f_fn1
AS SELECT *
   FROM t_fn1
  WHERE g::text = 'FN1'::text;



то JIT не выполняется независимо от настроек и сканирование выполняется только по одной секции:
Код: plaintext
1.
2.
3.
 Planning Time: 0.397 ms
  Execution Time: 1.333 ms 
(14 строк)
Время: 2,548 мс

PS и всеж интересно что означает JIT Emission
...
Рейтинг: 0 / 0
jit компиляция, timing и скорость выполнения запроса
    #40038990
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111
PS и всеж интересно что означает JIT Emission

Думаю Andres Freund взял штатную терминологию LLVM, а потому
Code Emission — The final stage actually puts out the code for the current function, either in the target assembler format or in machine code.
В Emission в explain показывается время вот этого куска: https://github.com/postgres/postgres/blob/REL_12_STABLE/src/backend/jit/llvm/llvmjit.c#L661 до INSTR_TIME_ACCUM_DIFF ниже. Но я в LLVM не копенгаген, так что дальше ничего рассказать не смогу.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / jit компиляция, timing и скорость выполнения запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]