SlideShare uma empresa Scribd logo
1 de 52
Baixar para ler offline
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???
SQL Query Planner

Mais conteúdo relacionado

Destaque

Como posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLComo posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLFabrízio Mello
 
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di CiurcioDevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di CiurcioPGDay Campinas
 
Extensions on PostgreSQL
Extensions on PostgreSQLExtensions on PostgreSQL
Extensions on PostgreSQLAlpaca
 
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...Андрей Анатольевич Ващенко
 
יחידת הוראה לחנכה
יחידת הוראה לחנכהיחידת הוראה לחנכה
יחידת הוראה לחנכהMax Rokach
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database RefactoringFabrízio Mello
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrízio Mello
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de DadosFabrízio Mello
 
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) Fabrízio Mello
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Fabrízio Mello
 
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)Fabrízio Mello
 
PostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyPostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyJuliano Atanazio
 
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosFabrízio Mello
 
Greenplum: O banco de dados open source massivamente paralelo baseado em Post...
Greenplum: O banco de dados open source massivamente paralelo baseado em Post...Greenplum: O banco de dados open source massivamente paralelo baseado em Post...
Greenplum: O banco de dados open source massivamente paralelo baseado em Post...PGDay Campinas
 

Destaque (15)

Como posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLComo posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQL
 
Dojo plpgsql
Dojo plpgsqlDojo plpgsql
Dojo plpgsql
 
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di CiurcioDevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
DevOps e PostgreSQL: Replicação de forma simplificada | Miguel Di Ciurcio
 
Extensions on PostgreSQL
Extensions on PostgreSQLExtensions on PostgreSQL
Extensions on PostgreSQL
 
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
Курс лекций на программу МВА в РУДН 16 февраля 2016 Тема "Управление изменени...
 
יחידת הוראה לחנכה
יחידת הוראה לחנכהיחידת הוראה לחנכה
יחידת הוראה לחנכה
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database Refactoring
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de Dados
 
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)
 
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
 
PostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyPostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords Safely
 
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
 
Greenplum: O banco de dados open source massivamente paralelo baseado em Post...
Greenplum: O banco de dados open source massivamente paralelo baseado em Post...Greenplum: O banco de dados open source massivamente paralelo baseado em Post...
Greenplum: O banco de dados open source massivamente paralelo baseado em Post...
 

Semelhante a SQL Query Planner

Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlLocaweb
 
Visualização de Dados - Aula 4
Visualização de Dados - Aula 4Visualização de Dados - Aula 4
Visualização de Dados - Aula 4VicenteTino
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na PráticaEiti Kimura
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Práticatdc-globalcode
 
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2João Gabriel Lima
 
Elementary Circuits Enumeration in Graphs
Elementary Circuits Enumeration in GraphsElementary Circuits Enumeration in Graphs
Elementary Circuits Enumeration in GraphsLuiz Kill
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoIntel Software Brasil
 
2016 2 oficina matematica - minimos quadrados
2016 2 oficina matematica - minimos quadrados2016 2 oficina matematica - minimos quadrados
2016 2 oficina matematica - minimos quadradosPaulo Cezar Pagnossin
 
Oficina: construção de modelos descritivos e preditivos utilizando R
Oficina: construção de modelos descritivos e preditivos utilizando ROficina: construção de modelos descritivos e preditivos utilizando R
Oficina: construção de modelos descritivos e preditivos utilizando RFabrício Barth
 
Solução de equações não lineares weslley
Solução de equações não lineares weslleySolução de equações não lineares weslley
Solução de equações não lineares weslleyWeslley Assis
 
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
Cálculo Numérico: Interpolação Polinomial com Bubble SortCálculo Numérico: Interpolação Polinomial com Bubble Sort
Cálculo Numérico: Interpolação Polinomial com Bubble SortJohnnatan Messias
 
SysSorting Professional
SysSorting ProfessionalSysSorting Professional
SysSorting ProfessionalMichel Alves
 
Algoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesAlgoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesRADILSON RIPARDO DE FRETIAS
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelasRicardo Bolanho
 

Semelhante a SQL Query Planner (17)

Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sql
 
Visualização de Dados - Aula 4
Visualização de Dados - Aula 4Visualização de Dados - Aula 4
Visualização de Dados - Aula 4
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Prática
 
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
Escalando o algoritmo de aprendizagem da estrutura da rede bayesiana k2
 
Elementary Circuits Enumeration in Graphs
Elementary Circuits Enumeration in GraphsElementary Circuits Enumeration in Graphs
Elementary Circuits Enumeration in Graphs
 
Destistificando o EXPLAIN
Destistificando o EXPLAIN Destistificando o EXPLAIN
Destistificando o EXPLAIN
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorização
 
2016 2 oficina matematica - minimos quadrados
2016 2 oficina matematica - minimos quadrados2016 2 oficina matematica - minimos quadrados
2016 2 oficina matematica - minimos quadrados
 
Oficina: construção de modelos descritivos e preditivos utilizando R
Oficina: construção de modelos descritivos e preditivos utilizando ROficina: construção de modelos descritivos e preditivos utilizando R
Oficina: construção de modelos descritivos e preditivos utilizando R
 
Solução de equações não lineares weslley
Solução de equações não lineares weslleySolução de equações não lineares weslley
Solução de equações não lineares weslley
 
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
Cálculo Numérico: Interpolação Polinomial com Bubble SortCálculo Numérico: Interpolação Polinomial com Bubble Sort
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
 
SysSorting Professional
SysSorting ProfessionalSysSorting Professional
SysSorting Professional
 
Tutorial slide
Tutorial slideTutorial slide
Tutorial slide
 
Elementos de Matemática Básica - Funções
Elementos de Matemática Básica - FunçõesElementos de Matemática Básica - Funções
Elementos de Matemática Básica - Funções
 
Algoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesAlgoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizes
 
14 algoritmos de classificacao de tabelas
14   algoritmos de classificacao de tabelas14   algoritmos de classificacao de tabelas
14 algoritmos de classificacao de tabelas
 

Mais de Fabrízio Mello

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

Mais de Fabrízio Mello (13)

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

SQL Query Planner

  • 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