SlideShare uma empresa Scribd logo
The PostgreSQL
Query Planner
Por que minha consulta (SQL)
precisa de um plano?
Simples...
● SQL é declarativo, ou seja, não é um programa
● Não possui controle de fluxo e não tem uma
forma de controlar a ordem das operações
– A não ser “While” e “For”, mas isso é conversa para
outro treinamento ;-)
● SQL pergunta O QUE, e não diz COMO
Planejador/Otimizador
é o Cérebro do banco de dados...
… pois interpreta
consultas SQL e
determina o método
de execução mais
rápido.
Objetivos do Planejador
● Executar consultas mais rapidamente
– Diminuir I/O de disco
– Priorizar I/O sequencial a I/O randômico
– Diminuir uso de CPU
● Não utilizar muita memória no
processo
● Entregar resultados corretos
Decisões do planejador
● Método de Pesquisa (Scan Method)
● Método de Junção (Join Method)
● Ordem de Junção (Join Order)
Métodos de Pesquisa
(Scan Methods)
● Sequential Scan
● Bitmap Index Scan
● Index Scan
Sequential Scan
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
8K
Heap
Sequential Scan
Bitmap Index Scan
0
1
0
1
AND =
0
1
1
0
0
1
0
0
801 AND 11
Index 1
numcgm = 801
Index 2
receit = 11
Combined
Index
TABLE
Bitmap Index Scan
Bitmap Index Scan
Index 1
k00_numcgm = 801
Index 2
k00_receit = 11
Combined Index
(And Operator)
Index Scan
key
< = >
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
D
A
T
A
key
< = >
key
< = >
Index Scan
Index Scan
Dúvidas???
Tabela de exemplo
Função para EXPLAIN
Distribuição dos dados
Distribuição dos dados
tipo | count | %
------+-------+------
5 | 14892 | 77.6
34 | 2714 | 14.1
14 | 575 | 3.0
6 | 555 | 2.9
25 | 384 | 2.0
13 | 70 | 0.4
1 | 3 | 0.0
32 | 1 | 0.0
27 | 1 | 0.0
(9 rows)
Planos de execução
tipo | count | % | explain_arrecad
------+-------+------+-------------------------------------------------------------------------------
5 | 14892 | 77.6 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
5 | 14892 | 77.6 | Recheck Cond: (k00_tipo = 5)
5 | 14892 | 77.6 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
5 | 14892 | 77.6 | Index Cond: (k00_tipo = 5)
34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
34 | 2714 | 14.1 | Recheck Cond: (k00_tipo = 34)
34 | 2714 | 14.1 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
34 | 2714 | 14.1 | Index Cond: (k00_tipo = 34)
14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
14 | 575 | 3.0 | Recheck Cond: (k00_tipo = 14)
14 | 575 | 3.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
14 | 575 | 3.0 | Index Cond: (k00_tipo = 14)
6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
6 | 555 | 2.9 | Recheck Cond: (k00_tipo = 6)
6 | 555 | 2.9 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
6 | 555 | 2.9 | Index Cond: (k00_tipo = 6)
25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
25 | 384 | 2.0 | Recheck Cond: (k00_tipo = 25)
25 | 384 | 2.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
25 | 384 | 2.0 | Index Cond: (k00_tipo = 25)
13 | 70 | 0.4 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
13 | 70 | 0.4 | Recheck Cond: (k00_tipo = 13)
13 | 70 | 0.4 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
13 | 70 | 0.4 | Index Cond: (k00_tipo = 13)
1 | 3 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
1 | 3 | 0.0 | Recheck Cond: (k00_tipo = 1)
1 | 3 | 0.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
1 | 3 | 0.0 | Index Cond: (k00_tipo = 1)
27 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
27 | 1 | 0.0 | Recheck Cond: (k00_tipo = 27)
27 | 1 | 0.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
27 | 1 | 0.0 | Index Cond: (k00_tipo = 27)
32 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
32 | 1 | 0.0 | Recheck Cond: (k00_tipo = 32)
32 | 1 | 0.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0)
32 | 1 | 0.0 | Index Cond: (k00_tipo = 32)
(36 rows)
Tá bom, só uma linha do EXPLAIN
Melhorou agora?
tipo | count | % | explain_arrecad
------+-------+------+-------------------------------------------------------------------
5 | 14892 | 77.6 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
13 | 70 | 0.4 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
1 | 3 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
27 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
32 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52)
(9 rows)
Nada mudou né...
● Alguém arrisca dizer porque os planos estão
iguais???
● Mesmo buscando qtds diferentes de dados da
tabela???
Estatísticas desatualizadas
Estatísticas desatualizadas
ANALYZE é seu amigo...
Esses valores não são
familiares???
Verificar planos de novo...
Interessante não?
tipo | count | % | explain_arrecad
------+-------+------+----------------------------------------------------------------------------------
5 | 14892 | 77.6 | Seq Scan on arrecad (cost=0.00..499.94 rows=14892 width=52)
34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=39.28..333.21 rows=2714 width=52)
14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=8.71..275.89 rows=575 width=52)
6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=8.55..275.49 rows=555 width=52)
25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=7.23..250.28 rows=384 width=52)
13 | 70 | 0.4 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52)
1 | 3 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52)
32 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52)
27 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52)
(9 rows)
Vamos forçar um “IndexScan”?
Ficou mais rápido??
tipo | count | % | explain_arrecad
------+-------+------+------------------------------------------------------------------------------
5 | 14892 | 77.6 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..779.24 rows=14892 wi
34 | 2714 | 14.1 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..434.27 rows=2714 wid
14 | 575 | 3.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..373.73 rows=575 widt
6 | 555 | 2.9 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..373.38 rows=555 widt
25 | 384 | 2.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..316.27 rows=384 widt
13 | 70 | 0.4 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
1 | 3 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
27 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
32 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
(9 rows)
tipo | count | % | explain_arrecad
------+-------+------+------------------------------------------------------------------------------
5 | 14892 | 77.6 | Seq Scan on arrecad (cost=0.00..499.94 rows=14892 width=52)
34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=39.28..333.21 rows=2714 width=52)
14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=8.71..275.89 rows=575 width=52)
6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=8.55..275.49 rows=555 width=52)
25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=7.23..250.28 rows=384 width=52)
13 | 70 | 0.4 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
1 | 3 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
32 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
27 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=
(9 rows)
DICA!
“Não tente ser mais esperto que o planejador.”
Mas ele não é “infalível”, se você já tentou de tudo e mesmo
assim tem problemas, colabore seu plano conosco e nos
ajude a melhorá-lo:
pgsql-performance@postgresql.org
pgsql-hackers@postgresql.org
Métodos de Junção
(Join Methods)
● Nested Loop
– With inner Sequencial Scan
– With inner Index Scan
● Hash Join
● Merge Join
Junção de duas tabelas com
alta restrição (=)
Junção de duas tabelas com
alta restrição (=)
Nested Loop
(with Inner Sequencial Scan)
4
1
3
2
1
3
4
5
2
7
6
Outer Inner
Nested Loop
(with Inner Sequencial Scan)
4
1
3
2
1
3
4
5
2
7
6
Outer Inner
Nested Loop
(with Inner Sequencial Scan)
4
1
3
2
1
3
4
5
2
7
6
Outer Inner
Nested Loop
(with Inner Sequencial Scan)
4
1
3
2
1
3
4
5
2
7
6
Outer Inner
Pseudocode for Nested Loop
(with Inner Sequencial Scan)
Junção de duas tabelas com
baixa restrição (>, <, <>)
Junção de duas tabelas com
baixa restrição (>, <, <>)
Hash Join
4
1
3
2 1
34
5
2 7
6
Outer Inner
Deve caber na RAM
Hashed
Pseudocode for Hash Join
Junção de duas tabelas
sem restrição
Junção de duas tabelas
sem restrição
Merge Join
Outer Inner
Ideal para grandes tabelas
Um índice pode ser usado para eliminar o “Sort”
2
3
4
1
2
2
3
1
4
5
4
Sorted Sorted
Pseudocode for Merge Join
Algumas considerações
● Ordem das junções é insignificante
● Outer Joins (left, right) podem afetar o
otimizador
● Nested Loop pode usar índice na pesquisa
● Restrições (where) afetam o uso de junções
● LIMIT pode afetar o uso de junções
Dúvidas???
Planejador de Consultas do PostgreSQL

Mais conteúdo relacionado

PDF
Tutorial memcached
PPTX
PB市場における卸売業者の生き残り策
PDF
데이터야놀자2018-들어는 봤니? 유저로그 자동화-구민서
PDF
인공지능 식별추적시스템 성능 검증 평가 사례
PDF
Django congress jp 2019 make query great again! (slide share)
PDF
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [BICS팀] : Boaz Industry Classification Standard
PDF
EXPLicando o Explain no PostgreSQL
PDF
GSoC2014 - PGDay Ijui/RS Presentation October, 2016
Tutorial memcached
PB市場における卸売業者の生き残り策
데이터야놀자2018-들어는 봤니? 유저로그 자동화-구민서
인공지능 식별추적시스템 성능 검증 평가 사례
Django congress jp 2019 make query great again! (slide share)
제 14회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [BICS팀] : Boaz Industry Classification Standard
EXPLicando o Explain no PostgreSQL
GSoC2014 - PGDay Ijui/RS Presentation October, 2016

Destaque (20)

PDF
GSoC2014 - PGCon2015 Presentation June, 2015
PDF
Bad Smells (mal cheiros) em Bancos de Dados
PDF
Keep calm and Database Continuous Deployment
PDF
Sharing Code and Experiences
ODP
Postgres Wonderland - PGDay Cascavél 2013
PDF
GSoC2014 - Uniritter Presentation May, 2015
PDF
Como posso colaborar com o PostgreSQL
PDF
Dojo plpgsql
PDF
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
PDF
Extensions on PostgreSQL
PPTX
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
PPT
יחידת הוראה לחנכה
PDF
Tutorial Database Refactoring
PDF
Bad Smells (mal cheiros) em Bancos de Dados
PDF
Bad Smells em Bancos de Dados
PDF
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
PDF
Dojo PHP (treinanto programação orientada a objetos em PHP)
PDF
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
PDF
PostgreSQL: How to Store Passwords Safely
PDF
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
GSoC2014 - PGCon2015 Presentation June, 2015
Bad Smells (mal cheiros) em Bancos de Dados
Keep calm and Database Continuous Deployment
Sharing Code and Experiences
Postgres Wonderland - PGDay Cascavél 2013
GSoC2014 - Uniritter Presentation May, 2015
Como posso colaborar com o PostgreSQL
Dojo plpgsql
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
Extensions on PostgreSQL
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
יחידת הוראה לחנכה
Tutorial Database Refactoring
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells em Bancos de Dados
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
Dojo PHP (treinanto programação orientada a objetos em PHP)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
PostgreSQL: How to Store Passwords Safely
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
Anúncio

Semelhante a Planejador de Consultas do PostgreSQL (20)

PDF
Uso de estatísticas pelo postgre sql
PPTX
Visualização de Dados - Aula 4
PDF
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
PDF
TDC2016SP - SparkMLlib Machine Learning na Prática
PDF
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
PPT
otimização de processos - analise computacional
PPTX
teoria dos grafos aplicado a engenharia de produçao.pptx
ODP
Elementary Circuits Enumeration in Graphs
PDF
Destistificando o EXPLAIN
PDF
Slides sobre função modular - teoria e exercícios
PDF
Principais conceitos e técnicas em vetorização
PPTX
2016 2 oficina matematica - minimos quadrados
PDF
Oficina: construção de modelos descritivos e preditivos utilizando R
PPT
Solução de equações não lineares weslley
PDF
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
PDF
SysSorting Professional
DOCX
Tutorial slide
PPTX
Elementos de Matemática Básica - Funções
PDF
Algoritmo e estruturas de dados operações com matrizes
PDF
14 algoritmos de classificacao de tabelas
Uso de estatísticas pelo postgre sql
Visualização de Dados - Aula 4
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Prática
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
otimização de processos - analise computacional
teoria dos grafos aplicado a engenharia de produçao.pptx
Elementary Circuits Enumeration in Graphs
Destistificando o EXPLAIN
Slides sobre função modular - teoria e exercícios
Principais conceitos e técnicas em vetorização
2016 2 oficina matematica - minimos quadrados
Oficina: construção de modelos descritivos e preditivos utilizando R
Solução de equações não lineares weslley
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
SysSorting Professional
Tutorial slide
Elementos de Matemática Básica - Funções
Algoritmo e estruturas de dados operações com matrizes
14 algoritmos de classificacao de tabelas
Anúncio

Mais de Fabrízio Mello (13)

PDF
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PDF
Bad Smells (mal cheiros) em Bancos de Dados
PPTX
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
PDF
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
PDF
Software Delivery Like a Boss
PDF
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
PDF
Oficina PostgreSQL Básico Latinoware 2012
ODP
Oficina postgresql avançado_consegi2010
ODP
Oficina postgresql basico_consegi2010
ODP
Database refactoring postgresql_consegi2010
ODP
Database Refactoring PostgreSQL Urcamp Alegrete 2009
ODP
Database Refactoring com PostgreSQL PGDay RS 2009
ODP
Refatoração Banco de Dados (Agileweekend2009)
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
Bad Smells (mal cheiros) em Bancos de Dados
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
Software Delivery Like a Boss
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
Oficina PostgreSQL Básico Latinoware 2012
Oficina postgresql avançado_consegi2010
Oficina postgresql basico_consegi2010
Database refactoring postgresql_consegi2010
Database Refactoring PostgreSQL Urcamp Alegrete 2009
Database Refactoring com PostgreSQL PGDay RS 2009
Refatoração Banco de Dados (Agileweekend2009)

Último (19)

PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Processos na gestão de transportes, TM100 Col18
Aula 18 - Manipulacao De Arquivos python
COBITxITIL-Entenda as diferença em uso governança TI
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Custos e liquidação no SAP Transportation Management, TM130 Col18
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula04-Academia Heri- Tecnologia Geral 2025
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Apple Pippin Uma breve introdução. - David Glotz
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Otimizador de planejamento e execução no SAP Transportation Management, TM120...

Planejador de Consultas do PostgreSQL

  • 2. Por que minha consulta (SQL) precisa de um plano?
  • 3. Simples... ● SQL é declarativo, ou seja, não é um programa ● Não possui controle de fluxo e não tem uma forma de controlar a ordem das operações – A não ser “While” e “For”, mas isso é conversa para outro treinamento ;-) ● SQL pergunta O QUE, e não diz COMO
  • 4. Planejador/Otimizador é o Cérebro do banco de dados... … pois interpreta consultas SQL e determina o método de execução mais rápido.
  • 5. Objetivos do Planejador ● Executar consultas mais rapidamente – Diminuir I/O de disco – Priorizar I/O sequencial a I/O randômico – Diminuir uso de CPU ● Não utilizar muita memória no processo ● Entregar resultados corretos
  • 6. Decisões do planejador ● Método de Pesquisa (Scan Method) ● Método de Junção (Join Method) ● Ordem de Junção (Join Order)
  • 7. Métodos de Pesquisa (Scan Methods) ● Sequential Scan ● Bitmap Index Scan ● Index Scan
  • 10. Bitmap Index Scan 0 1 0 1 AND = 0 1 1 0 0 1 0 0 801 AND 11 Index 1 numcgm = 801 Index 2 receit = 11 Combined Index TABLE
  • 12. Bitmap Index Scan Index 1 k00_numcgm = 801 Index 2 k00_receit = 11 Combined Index (And Operator)
  • 13. Index Scan key < = > D A T A D A T A D A T A D A T A D A T A D A T A D A T A D A T A D A T A D A T A D A T A D A T A key < = > key < = >
  • 20. Distribuição dos dados tipo | count | % ------+-------+------ 5 | 14892 | 77.6 34 | 2714 | 14.1 14 | 575 | 3.0 6 | 555 | 2.9 25 | 384 | 2.0 13 | 70 | 0.4 1 | 3 | 0.0 32 | 1 | 0.0 27 | 1 | 0.0 (9 rows)
  • 22. tipo | count | % | explain_arrecad ------+-------+------+------------------------------------------------------------------------------- 5 | 14892 | 77.6 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 5 | 14892 | 77.6 | Recheck Cond: (k00_tipo = 5) 5 | 14892 | 77.6 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 5 | 14892 | 77.6 | Index Cond: (k00_tipo = 5) 34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 34 | 2714 | 14.1 | Recheck Cond: (k00_tipo = 34) 34 | 2714 | 14.1 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 34 | 2714 | 14.1 | Index Cond: (k00_tipo = 34) 14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 14 | 575 | 3.0 | Recheck Cond: (k00_tipo = 14) 14 | 575 | 3.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 14 | 575 | 3.0 | Index Cond: (k00_tipo = 14) 6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 6 | 555 | 2.9 | Recheck Cond: (k00_tipo = 6) 6 | 555 | 2.9 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 6 | 555 | 2.9 | Index Cond: (k00_tipo = 6) 25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 25 | 384 | 2.0 | Recheck Cond: (k00_tipo = 25) 25 | 384 | 2.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 25 | 384 | 2.0 | Index Cond: (k00_tipo = 25) 13 | 70 | 0.4 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 13 | 70 | 0.4 | Recheck Cond: (k00_tipo = 13) 13 | 70 | 0.4 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 13 | 70 | 0.4 | Index Cond: (k00_tipo = 13) 1 | 3 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 1 | 3 | 0.0 | Recheck Cond: (k00_tipo = 1) 1 | 3 | 0.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 1 | 3 | 0.0 | Index Cond: (k00_tipo = 1) 27 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 27 | 1 | 0.0 | Recheck Cond: (k00_tipo = 27) 27 | 1 | 0.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 27 | 1 | 0.0 | Index Cond: (k00_tipo = 27) 32 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 32 | 1 | 0.0 | Recheck Cond: (k00_tipo = 32) 32 | 1 | 0.0 | -> Bitmap Index Scan on arrecad_tipo_in (cost=0.00..2.97 rows=96 width=0) 32 | 1 | 0.0 | Index Cond: (k00_tipo = 32) (36 rows)
  • 23. Tá bom, só uma linha do EXPLAIN
  • 24. Melhorou agora? tipo | count | % | explain_arrecad ------+-------+------+------------------------------------------------------------------- 5 | 14892 | 77.6 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 13 | 70 | 0.4 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 1 | 3 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 27 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) 32 | 1 | 0.0 | Bitmap Heap Scan on arrecad (cost=3.00..122.14 rows=96 width=52) (9 rows)
  • 25. Nada mudou né... ● Alguém arrisca dizer porque os planos estão iguais??? ● Mesmo buscando qtds diferentes de dados da tabela???
  • 28. ANALYZE é seu amigo... Esses valores não são familiares???
  • 30. Interessante não? tipo | count | % | explain_arrecad ------+-------+------+---------------------------------------------------------------------------------- 5 | 14892 | 77.6 | Seq Scan on arrecad (cost=0.00..499.94 rows=14892 width=52) 34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=39.28..333.21 rows=2714 width=52) 14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=8.71..275.89 rows=575 width=52) 6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=8.55..275.49 rows=555 width=52) 25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=7.23..250.28 rows=384 width=52) 13 | 70 | 0.4 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52) 1 | 3 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52) 32 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52) 27 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width=52) (9 rows)
  • 31. Vamos forçar um “IndexScan”?
  • 32. Ficou mais rápido?? tipo | count | % | explain_arrecad ------+-------+------+------------------------------------------------------------------------------ 5 | 14892 | 77.6 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..779.24 rows=14892 wi 34 | 2714 | 14.1 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..434.27 rows=2714 wid 14 | 575 | 3.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..373.73 rows=575 widt 6 | 555 | 2.9 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..373.38 rows=555 widt 25 | 384 | 2.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..316.27 rows=384 widt 13 | 70 | 0.4 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= 1 | 3 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= 27 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= 32 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= (9 rows) tipo | count | % | explain_arrecad ------+-------+------+------------------------------------------------------------------------------ 5 | 14892 | 77.6 | Seq Scan on arrecad (cost=0.00..499.94 rows=14892 width=52) 34 | 2714 | 14.1 | Bitmap Heap Scan on arrecad (cost=39.28..333.21 rows=2714 width=52) 14 | 575 | 3.0 | Bitmap Heap Scan on arrecad (cost=8.71..275.89 rows=575 width=52) 6 | 555 | 2.9 | Bitmap Heap Scan on arrecad (cost=8.55..275.49 rows=555 width=52) 25 | 384 | 2.0 | Bitmap Heap Scan on arrecad (cost=7.23..250.28 rows=384 width=52) 13 | 70 | 0.4 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= 1 | 3 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= 32 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= 27 | 1 | 0.0 | Index Scan using arrecad_tipo_in on arrecad (cost=0.00..29.27 rows=19 width= (9 rows)
  • 33. DICA! “Não tente ser mais esperto que o planejador.” Mas ele não é “infalível”, se você já tentou de tudo e mesmo assim tem problemas, colabore seu plano conosco e nos ajude a melhorá-lo: pgsql-performance@postgresql.org pgsql-hackers@postgresql.org
  • 34. Métodos de Junção (Join Methods) ● Nested Loop – With inner Sequencial Scan – With inner Index Scan ● Hash Join ● Merge Join
  • 35. Junção de duas tabelas com alta restrição (=)
  • 36. Junção de duas tabelas com alta restrição (=)
  • 37. Nested Loop (with Inner Sequencial Scan) 4 1 3 2 1 3 4 5 2 7 6 Outer Inner
  • 38. Nested Loop (with Inner Sequencial Scan) 4 1 3 2 1 3 4 5 2 7 6 Outer Inner
  • 39. Nested Loop (with Inner Sequencial Scan) 4 1 3 2 1 3 4 5 2 7 6 Outer Inner
  • 40. Nested Loop (with Inner Sequencial Scan) 4 1 3 2 1 3 4 5 2 7 6 Outer Inner
  • 41. Pseudocode for Nested Loop (with Inner Sequencial Scan)
  • 42. Junção de duas tabelas com baixa restrição (>, <, <>)
  • 43. Junção de duas tabelas com baixa restrição (>, <, <>)
  • 44. Hash Join 4 1 3 2 1 34 5 2 7 6 Outer Inner Deve caber na RAM Hashed
  • 46. Junção de duas tabelas sem restrição
  • 47. Junção de duas tabelas sem restrição
  • 48. Merge Join Outer Inner Ideal para grandes tabelas Um índice pode ser usado para eliminar o “Sort” 2 3 4 1 2 2 3 1 4 5 4 Sorted Sorted
  • 50. Algumas considerações ● Ordem das junções é insignificante ● Outer Joins (left, right) podem afetar o otimizador ● Nested Loop pode usar índice na pesquisa ● Restrições (where) afetam o uso de junções ● LIMIT pode afetar o uso de junções