Este documento apresenta uma palestra sobre otimização de desempenho no PostgreSQL utilizando JIT (Just-In-Time compilation). A palestra abordará o que é JIT, operações otimizadas, instalação, configuração e verificação do JIT, além de apresentar resultados de benchmark mostrando ganhos de desempenho de até 29% com o JIT no PostgreSQL 11.
2. PALESTRANTES
Gerdan Rezende dos Santos
Brasília - DF
Tecnisys Tecnologias Inovadoras
Especialista em Banco de Dados
e Big Data
Ativo em várias comunidades de
software livre, sendo um apaixonado por
tecnologias open source
Organizador e palestrante do PGDay
Brasília. Já palestrou em eventos da IBM,
Latinoware, entre outros
https://www.linkedin.com/in/gerdan
Davy Alvarenga Machado
Brasília - DF
Tecnisys Tecnologias Inovadoras
Especialista em Banco de Dados
e Big Data
Ativista open source e curioso por
natureza
Revisor e contribuidor da comunidade
PostgreSQL e Apache
Organizador e palestrante do PGDay
Brasília
https://br.linkedin.com/in/davy-alvarenga-machado
3. TECNISYS
Referência nacional em soluções open source
atuando no mercado de TI a mais de 25 anos
Parceira de empresas líderes internacionalmente,
tais como, EnterpriseDB, Hortonworks, Cloudera,
Red Hat, SUSE, entre outras
Especialistas em Banco de Dados, Big Data,
Sistemas Operacionais, Middlewares, entre outras
áreas
Principal via estratégica de mercado da
EnterpriseDB para o território brasileiro
Suporte ao PostgreSQL 24x7, com atendimento
inicial em menos de 15 min via 0800, site ou e-
mail
4. AGENDA
O que é o JIT
Operações JITed
Se liga!
Instalando, Configurando e Verificando
Benchmark
Dúvidas
5. JUST-IN-TIME (JIT)
Programa interpretado para liguagem de máquina (bytecode)
Expressões SQL para código nativo = Aumento de desempenho (CPU)
Tudo isso em tempo de planejamento baby!
LLVM (compiler infrastructure) – JIT Provider
Avaliação de Expressões e Deformação de Tuplas
Thank you so much Andres Freund!
6. OPERAÇÕES JITED
Avaliação de Expressões
Filtros (WHERE)
Agregações (GROUP BY, SUM, COUNT, MAX, MIN, etc)
Projeções (SELECT …)
Deformação de Tuplas
Representação in-memory de tuplas
Função própria para o layout data tabela
Acesso rápido e fácil
No futuro, outras operações poderão ser otimizadas pelo JIT
7. SE LIGA!
Não existe almoço grátis! O JIT tem o seu custo!
Good Queries longas, como consultas analíticas (OLAP)
Good Queries com várias expressões complexas, como agregações
Good Queries limitadas pelo CPU
Bad Queries rápidas
(JIT overhead maior que o tempo ganho na execução)
9. CONFIGURANDO ...
Por padrão, o JIT vem desabilitado
postgresql.conf jit = on (não requer restart)
ALTER SYSTEM SET jit = on;
SET jit = on;
Acionamento baseado no custo estimado da query
jit_above_cost = 100000 (default)
jit_inline_above_cost = 500000 (default)
jit_optimize_above_cost = 500000 (default)
10. VERIFICANDO ...
=# SET jit_above_cost = 10;
SET
=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=6.049..6.049 rows=1 loops=1)
-> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.019..0.052 rows=356 loops=1)
Planning Time: 0.133 ms
JIT:
Functions: 3
Options: Inlining false, Optimization false, Expressions true, Deforming true
Timing: Generation 1.259 ms, Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 ms
Execution Time: 7.416 ms
Tip Use a opção BUFFERS do EXPLAIN para analisar o impacto do
uso do cache na execução da query: EXPLAIN (ANALYZE, BUFFERS)
11. BENCHMARK
TPC-H - Sistemas de suporte à decisão
Scale Factor 10
Banco de dados de 22GB, incluindo índices
Loop de 10 min
AWS c5.4xlarge
Paralelização de queries desativada
PG 9.6 x PG 10 x PG 11 (JIT)
12. BENCHMARK
Pricing Summary Report Query (Q1)
select
l_returnflag, l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from
lineitem
where
l_shipdate <= date '1998-12-01' - interval ':1' day
group by
l_returnflag, l_linestatus
order by
l_returnflag, l_linestatus :n -1 ;