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
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)
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
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