postgresql performancessn/2010/lbaw/slides/lbaw-pgsql.pdf · para cada tuplo da tabela dependendo...

52
PostgreSQL Performance André Restivo Faculdade de Engenharia da Universidade do Porto March 2, 2011 André Restivo (FEUP) PostgreSQL Performance March 2, 2011 1 / 45

Upload: lamphuc

Post on 07-Feb-2019

214 views

Category:

Documents


0 download

TRANSCRIPT

PostgreSQL Performance

André Restivo

Faculdade de Engenharia da Universidade do Porto

March 2, 2011

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 1 / 45

Sumário

1 Armazenamento

2 Índices

3 Planeamento

4 PostgreSQL

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 2 / 45

Armazenamento

Outline

1 Armazenamento

2 Índices

3 Planeamento

4 PostgreSQL

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 3 / 45

Armazenamento

Armazenamento

Dados guardados em blocos (unidades mínimas de leitura).

Cada bloco contém vários tuplos.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 4 / 45

Armazenamento

Indicadores

Número de Tuplos: t

Tamanho do Bloco: B bytes

Tamanho de cada tuplo: T bytes

Normalmente B >= T

Blocking Factor - bfr = B / T

Número de Blocos - b = t / bfr

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 5 / 45

Armazenamento

Performance

Um dos maiores obstáculos a uma boa performance é o acesso aodisco.

Os acessos ao disco são feitos bloco a bloco.

É necessário minimizar o número de blocos que é necessário ler decada vez que se consulta informação da base de dados.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 6 / 45

Armazenamento

Exemplo

t = 30000 tuplos

B = 1024 bytes

T = 100 bytes

bfr = 1024 / 100 = 10 tuplos por bloco

b = 30000 / 10 = 3000 blocos

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 7 / 45

Armazenamento

Tuplos Desordenados

Ficheiro Sequencial de Tuplos Desordenados.Pesquisa:

◮ Pela chave primária◮ Por outro campo

Vantagens: inserção.

Desvantagens: remoção, pesquisa, ordenação, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 8 / 45

Armazenamento

Tuplos Desordenados

Ficheiro Sequencial de Tuplos Desordenados.Pesquisa:

◮ Pela chave primária - b/2 leituras = 1500◮ Por outro campo - b leituras = 3000

Vantagens: inserção.

Desvantagens: remoção, pesquisa, ordenação, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 8 / 45

Armazenamento

Tuplos Ordenados pela Chave Primária

Ficheiro Sequencial de Tuplos Ordenados pela ChavePrimária.Pesquisa:

◮ Pela chave primária◮ Por outro campo

Vantagens: pesquisa e ordenação pela chave primária.

Desvantagens: inserção, remoção, pesquisa eordenação por outras colunas, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 9 / 45

Armazenamento

Tuplos Ordenados pela Chave Primária

Ficheiro Sequencial de Tuplos Ordenados pela ChavePrimária.Pesquisa:

◮ Pela chave primária - log2b = 12 leituras◮ Por outro campo - b = 3000 leituras

Vantagens: pesquisa e ordenação pela chave primária.

Desvantagens: inserção, remoção, pesquisa eordenação por outras colunas, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 9 / 45

Índices

Outline

1 Armazenamento

2 Índices

3 Planeamento

4 PostgreSQL

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 10 / 45

Índices

Indexação Hash

Ficheiros indexados usando uma funçãode Hash.

Pesquisa

Vantagens: pesquisa (igualdade),remoção, inserção.

Desvantagens: pesquisa (outrométodo), ordenação, colisões, espaçoem disco, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 11 / 45

Índices

Indexação Hash

Ficheiros indexados usando uma funçãode Hash.

Pesquisa - 1 leitura

Vantagens: pesquisa (igualdade),remoção, inserção.

Desvantagens: pesquisa (outrométodo), ordenação, colisões, espaçoem disco, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 11 / 45

Índices

Indexação por Apontadores

Ficheiros auxiliares ordenados contendo pares valor/apontador.

Índices densos contêm um par valor/apontador para cada tuplo.

Índices esparsos contêm um par valor/apontador para cada bloco.Usados apenas quando os tuplos estão ordenados pelo campo deindexação.

Índices primários quando o campo de indexação é a chave primária.

Índices secundários quando o campo de indexação é outro.

Índices aglomerado (clustered) quando os tuplos estão ordenadospelo campo de indexação.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 12 / 45

Índices

Indexação por Apontadores

Índice esparso primário aglomerado. Índice denso secundário.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 13 / 45

Índices

Exemplo Índice Denso

Campo de indexação = 9 bytesApontador para bloco = 6 bytes (2.8x1014 tuplos)

ti = r = 30000

Ti = 9 + 6 = 15 bytes

bfri = 1024 / 15 = 68 tuplos por bloco

bi = 30000 / 68 = 442 blocos

Pesquisa

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 14 / 45

Índices

Exemplo Índice Denso

Campo de indexação = 9 bytesApontador para bloco = 6 bytes (2.8x1014 tuplos)

ti = r = 30000

Ti = 9 + 6 = 15 bytes

bfri = 1024 / 15 = 68 tuplos por bloco

bi = 30000 / 68 = 442 blocos

Pesquisa - log2442+1 = 10 leituras

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 14 / 45

Índices

Exemplo Índice Esparso

Campo de indexação = 9 bytesApontador para bloco = 6 bytes (2.8x1014 tuplos)

ti = b = 3000

Ti = 9 + 6 = 15 bytes

bfri = 1024 / 15 = 68 tuplos por bloco

bi = 3000 / 68 = 45 blocos

Pesquisa

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 15 / 45

Índices

Exemplo Índice Esparso

Campo de indexação = 9 bytesApontador para bloco = 6 bytes (2.8x1014 tuplos)

ti = b = 3000

Ti = 9 + 6 = 15 bytes

bfri = 1024 / 15 = 68 tuplos por bloco

bi = 3000 / 68 = 45 blocos

Pesquisa - log245+1 = 7 leituras

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 15 / 45

Índices

Índice Multinível

Cada nível indexa o nível seguinte.

bi2 = 30000/68 = 442 blocosbi1 = 442/68 = 7 blocosbi0 = 7/68 = 1 blocoPesquisa

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 16 / 45

Índices

Índice Multinível

Cada nível indexa o nível seguinte.

bi2 = 30000/68 = 442 blocosbi1 = 442/68 = 7 blocosbi0 = 7/68 = 1 blocoPesquisa - 4 leituras

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 16 / 45

Índices

Árvores B+

Este tipo de indexação baseia-se numa estrutura de dados em formade árvore em que cada nodo contém:

◮ q apontadores para outro nodo◮ q – 1 valores

Os nodos do último nível (folhas) contêm:◮ q – 1 apontadores◮ – q – 1 valores◮ – apontador para o próximo bloco folha

Permite também ordenar e pesquisar em intervalos (ao contrário dosindíces hash).

Vantagens: pesquisa em intervalos, ordenação, ...

Desvantagens: pesquisa (um pouco mais lenta do que com hash),inserção, remoção, reorganização, ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 17 / 45

Índices

Árvores B+

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 18 / 45

Índices

Árvores B+

A ocupação de uma árvore B+ nunca deve ultrapassar 90% da suacapacidade.

Quando este valor é atingido, é criada um novo nível na árvore.Numa árvore B+ a 70% da sua capacidade:

◮ Árvore B+ com espaço para 34 pares valor-apontador.◮ 34 * 0.7 = 22 valores e 23 apontadores.◮ Raiz: 1 nó = 22 valores e 23 apontadores.◮ Nível 1: 23 nós = 506 valores e 529 apontadores.◮ Nível 2: 529 nós = 11638 entradas e 12167 apontadores.◮ Folhas: 12167 nós = 255507 apontadores para blocos.◮ 2.5 milhões de tuplos.

Permite pesquisar qualquer valor lendo apenas 5 blocos.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 19 / 45

Índices

Índices Bitmap

Os índices bitmap são utilizados em colunas com poucos valoresdiferentes.

Para cada valor possível é criado um bitmap contendo um 0 ou um 1para cada tuplo da tabela dependendo do valor da coluna ser igual aovalor do bitmap.

Utilizando operações extremamente rápidas, um índice bitmap écapaz de calcular quais os tuplos que tornam verdade uma expressãobooleana.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 20 / 45

Índices

Índices Bitmap

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 21 / 45

Índices

Índices Bitmap

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 21 / 45

Índices

Índices Bitmap

Campo de indexação → Masculino / Feminino

ti = t = 30000

Ti = 2 estados = 2 bits

bfri = 1024 * 8 / 2 = 4096 tuplos por bloco

bi = 30000 / 4096 = 8 blocos

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 22 / 45

Índices

Full Text Search

Pesquisa em texto. Sem mais nenhum mecanismo:◮ Podemos pesquisar por The mas não por five.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 23 / 45

Índices

Full Text Search

Separando o índice em palavras e retirando as maiúsculas.◮ Podemos pesquisar por five mas não por ive.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 24 / 45

Índices

Full Text Search

Separando cada palavra nas suas terminações.◮ Podemos pesquisar por pack.◮ Podemos pesquisar por ack.◮ Podemos pesquisar por pac.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 25 / 45

Índices

Full Text Search

Pesquisa ainda mais eficaz:◮ Palavras que não devem ser indexadas (stop words).◮ Sinónimos (usando dicionários).◮ Frases como uma só palavra (thesaurus).◮ Diferentes variações de uma palavra (stem rules e dicionários).

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 26 / 45

Índices

Escolher Índices

São criados índices nas chaves primárias e únicas automaticamente.

Criar índices nos atributos pesquisados frequentemente em tabelasgrandes.

Criar índices nos atributos de junção (sempre?).

Criar índices hash se as pesquisas usar o operador de igualdade(junções também).

Criar índices do tipo btree para ordenações e pesquisas em intervalos.

Criar índices clustered se as pesquisas retornarem muitos resultados( 10%).

Usar ferramentas de análise.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 27 / 45

Planeamento

Outline

1 Armazenamento

2 Índices

3 Planeamento

4 PostgreSQL

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 28 / 45

Planeamento

Planeamento e Optimização de Queries

Ordem das junções (JOIN)◮ A (10 linhas), B (1000 linhas), C (1000000 linhas)◮ A⋊⋉ (B ⋊⋉ C) ou (A⋊⋉ B)⋊⋉ C◮ System R algorithm → programação dinâmica◮ Que índices usar?

Perguntas encadeadas (IN, NOT IN, EXISTS, ...)◮ Nem sempre podem ser transformadas em junções.◮ Por vezes são queries separadas (plano separado).

Estimativa de Custo de um Plano◮ Problema extremamente complicado.◮ O SGBD usam sistemas de regras e dados estatísticos.

"Inside the PostgreSQL Query Optimizer", Neil Conway, http://neilconway.org/talks/optimizer/optimizer.pdf

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 29 / 45

Planeamento

Planos Alternativos

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 30 / 45

PostgreSQL

Outline

1 Armazenamento

2 Índices

3 Planeamento

4 PostgreSQL

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 31 / 45

PostgreSQL

Criar Índices

Sintaxe

CREATE INDEX name ON tab le ( column ) USING ( type ) ;DROP INDEX name ;

type pode ser:◮ hash (não recomendado em PostgreSQL)◮ btree (por omissão)◮ gin (Generalized Inverted Index)◮ gist (Generalized Search Tree)

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 32 / 45

PostgreSQL

Índices Multi-coluna

Sintaxe

CREATE INDEX idxname ON tab lename ( column1 , column2 ) ;

Permite pesquisar por column1.

Permite pesquisar por column1 e column2.

Mas não por column2 isoladamente.

Similar a uma lista telefónica.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 33 / 45

PostgreSQL

Índices Únicos

Sintaxe

CREATE UNIQUE INDEX idxname ON tab lename ( column ) ;

Garantem que não existem repetidos.

Unique Keys são açucar sintático.

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 34 / 45

PostgreSQL

Índices Parciais

Sintaxe

CREATE INDEX idxname ON tab lename ( column )WHERE c o n d i t i o n ;

Permitem criar índices sobre partes de uma tabela.

São usados quando uma pesquisa usa a mesma condição do índice.

Permitem poupar espaço e tempo.

Exemplo

SELECT ∗ FROM u s e r WHERE t ype = ’ADMIN ’ ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 35 / 45

PostgreSQL

Índices Únicos Parciais

Sintaxe

CREATE UNIQUE INDEX idxname ON tab lename ( column )WHERE c o n d i t i o n ;

Permitem criar restrições que de outra forma tinham de ser feitasusando triggers.

Exemplo

CREATE UNIQUE INDEX admin_department_idxON peop l e ( dep_id ) WHERE t ype = ’ADMIN ’ ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 36 / 45

PostgreSQL

Índices Sobre Funções

Sintaxe

CREATE INDEX idxname ON tab lename ( e x p r e s s i o n ) ;

Permitem criar índices sobre o resultado de uma função.

Úteis quando queremos fazer pesquisas, não pelo valor de umacoluna, mas sim por o resultado de uma função.

Exemplo

CREATE INDEX d i f f e r e n c e _ i d xON t r a n s a c t i o n s ( c r e d i t − d e b i t ) ;

SELECT ∗ FROM t r a n s a c t i o n sWHERE c r e d i t − d e b i t > 1000 ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 37 / 45

PostgreSQL

Índices Sobre Funções

Sintaxe

CREATE INDEX idxname ON tab lename ( e x p r e s s i o n ) ;

Permitem criar índices sobre o resultado de uma função.

Úteis quando queremos fazer pesquisas, não pelo valor de umacoluna, mas sim por o resultado de uma função.

Exemplo

CREATE INDEX name_lower_idxON peop l e ( l o w e r c a s e (name ) ) ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 38 / 45

PostgreSQL

Clustering

Em PostgreSQL não existem índices clustered.

É no entanto possível organizar os tuplos de uma tabelaperiodicamente de acordo com um índice.

Cada tabela só pode estar organizada segundo um índice de cada vez.

A operação de clustering faz lock à tabela.

Sintaxe

CLUSTER tab lename USING idxname ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 39 / 45

PostgreSQL

Full Text Search

Usar índices do tipo gin ou gist.

Os índices são índices sobre expressões. Usar a mesma expressão nasperguntas.

Sintaxe

CREATE INDEX idxname ON tab lenameUSING g i n ( t o_ t s v e c t o r ( ’ e n g l i s h ’ , column ) ) ;

Sintaxe

SELECT ∗ FROM tab lenameWHERE t o_ t s v e c t o r ( ’ e n g l i s h ’ , column )

@@ to_t sque r y ( ’ s e a r c h ␣&␣ term ’ ) ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 40 / 45

PostgreSQL

Full Text Search Ranking

Sintaxe

SELECT column , t s_rank ( t o_ t s v e c t o r ( ’ e n g l i s h ’ , column ) ,t o_t sque r y ( ’ s e a r c h ␣&␣ term ’ ) )

FROM tab lenameWHERE t o_ t s v e c t o r ( ’ e n g l i s h ’ , column )

@@ to_t sque r y ( ’ s e a r c h ␣&␣ term ’ )ORDER BY t s_rank ( t o_ t s v e c t o r ( ’ e n g l i s h ’ , column ) ,

t o_t sque r y ( ’ s e a r c h ␣&␣ term ’ ) ) DESC

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 41 / 45

PostgreSQL

Explain

Mostra o plano que o PostgreSQL pensa utilizar para umadeterminada query.

Pode não ser o plano efectivamente usado (estatísticas podem estarerradas).

Sintaxe

EXPLAIN query ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 42 / 45

PostgreSQL

Explain Analyze

Mostra o plano que o PostgreSQL pensa utilizar para umadeterminada query e o realmente utilizado.

Executa mesmo a query.

Sintaxe

EXPLAIN ANALYZE query ;

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 43 / 45

PostgreSQL

Analyze e Explain

Alguns nodos dos planos:◮ Nested Loop◮ Sequential Scan◮ Index Scan◮ Index Condition◮ Aggregate◮ Bitmap Heap Scan◮ Bitmap Index Scan◮ Bitmap And/Or◮ Sort◮ ...

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 44 / 45

PostgreSQL

Reindex, Vacuum e Analyze

Comandos que devem ser usados periodicamente:◮ Reindex - Reorganiza um índice.◮ Vaccum - Recupera espaço desperdiçado.◮ Analyze - Calcula estatísticas.

Sintaxe

REINDEX [ idxname | tab lename ] ;ANALYZE [ tab lename ] ;VACUUM [ANALYZE] [ tab le ]

André Restivo (FEUP) PostgreSQL Performance March 2, 2011 45 / 45