PostgreSQL Performance André Restivo Faculdade de Engenharia da Universidade do Porto February 24, 2012 André Restivo (FEUP) PostgreSQL Performance February 24, 2012 1 / 45
Sumário 1 Armazenamento 2 Índices 3 Planeamento 4 PostgreSQL André Restivo (FEUP) PostgreSQL Performance February 24, 2012 2 / 45
Outline Armazenamento 1 Armazenamento 2 Índices 3 Planeamento 4 PostgreSQL André Restivo (FEUP) PostgreSQL Performance February 24, 2012 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 February 24, 2012 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 February 24, 2012 5 / 45
Armazenamento Performance Um dos maiores obstáculos a uma boa performance é o acesso ao disco. Os acessos ao disco são feitos bloco a bloco. É necessário minimizar o número de blocos que é necessário ler de cada vez que se consulta informação da base de dados. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 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 February 24, 2012 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 February 24, 2012 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 February 24, 2012 8 / 45
Armazenamento Tuplos Ordenados pela Chave Primária Ficheiro Sequencial de Tuplos Ordenados pela Chave Primária. Pesquisa: Pela chave primária Por outro campo Vantagens: pesquisa e ordenação pela chave primária. Desvantagens: inserção, remoção, pesquisa e ordenação por outras colunas,... André Restivo (FEUP) PostgreSQL Performance February 24, 2012 9 / 45
Armazenamento Tuplos Ordenados pela Chave Primária Ficheiro Sequencial de Tuplos Ordenados pela Chave Primária. Pesquisa: Pela chave primária - log2 b = 12 leituras Por outro campo - b = 3000 leituras Vantagens: pesquisa e ordenação pela chave primária. Desvantagens: inserção, remoção, pesquisa e ordenação por outras colunas,... André Restivo (FEUP) PostgreSQL Performance February 24, 2012 9 / 45
Outline Índices 1 Armazenamento 2 Índices 3 Planeamento 4 PostgreSQL André Restivo (FEUP) PostgreSQL Performance February 24, 2012 10 / 45
Índices Indexação Hash Ficheiros indexados usando uma função de Hash. Pesquisa Vantagens: pesquisa (igualdade), remoção, inserção. Desvantagens: pesquisa (outro método), ordenação, colisões, espaço em disco,... André Restivo (FEUP) PostgreSQL Performance February 24, 2012 11 / 45
Índices Indexação Hash Ficheiros indexados usando uma função de Hash. Pesquisa - 1 leitura Vantagens: pesquisa (igualdade), remoção, inserção. Desvantagens: pesquisa (outro método), ordenação, colisões, espaço em disco,... André Restivo (FEUP) PostgreSQL Performance February 24, 2012 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 de indexaçã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 ordenados pelo campo de indexação. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 12 / 45
Índices Indexação por Apontadores Índice esparso primário aglomerado. Índice denso secundário. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 13 / 45
Índices Exemplo Índice Denso Campo de indexação = 9 bytes Apontador para bloco = 6 bytes (2.8x10 14 tuplos) t i = r = 30000 T i = 9 + 6 = 15 bytes bfr i = 1024 / 15 = 68 tuplos por bloco b i = 30000 / 68 = 442 blocos Pesquisa André Restivo (FEUP) PostgreSQL Performance February 24, 2012 14 / 45
Índices Exemplo Índice Denso Campo de indexação = 9 bytes Apontador para bloco = 6 bytes (2.8x10 14 tuplos) t i = r = 30000 T i = 9 + 6 = 15 bytes bfr i = 1024 / 15 = 68 tuplos por bloco b i = 30000 / 68 = 442 blocos Pesquisa - log 2 442+1 = 10 leituras André Restivo (FEUP) PostgreSQL Performance February 24, 2012 14 / 45
Índices Exemplo Índice Esparso Campo de indexação = 9 bytes Apontador para bloco = 6 bytes (2.8x10 14 tuplos) t i = b = 3000 T i = 9 + 6 = 15 bytes bfr i = 1024 / 15 = 68 tuplos por bloco b i = 3000 / 68 = 45 blocos Pesquisa André Restivo (FEUP) PostgreSQL Performance February 24, 2012 15 / 45
Índices Exemplo Índice Esparso Campo de indexação = 9 bytes Apontador para bloco = 6 bytes (2.8x10 14 tuplos) t i = b = 3000 T i = 9 + 6 = 15 bytes bfr i = 1024 / 15 = 68 tuplos por bloco b i = 3000 / 68 = 45 blocos Pesquisa - log 2 45+1 = 7 leituras André Restivo (FEUP) PostgreSQL Performance February 24, 2012 15 / 45
Índice Multinível Índices Cada nível indexa o nível seguinte. b i2 = 30000/68=442 blocos b i1 = 442/68=7 blocos b i0 = 7/68=1 bloco Pesquisa André Restivo (FEUP) PostgreSQL Performance February 24, 2012 16 / 45
Índice Multinível Índices Cada nível indexa o nível seguinte. b i2 = 30000/68=442 blocos b i1 = 442/68=7 blocos b i0 = 7/68=1 bloco Pesquisa - 4 leituras André Restivo (FEUP) PostgreSQL Performance February 24, 2012 16 / 45
Árvores B+ Índices Este tipo de indexação baseia-se numa estrutura de dados em forma de á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 dos indí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 February 24, 2012 17 / 45
Árvores B+ Índices André Restivo (FEUP) PostgreSQL Performance February 24, 2012 18 / 45
Índices Árvores B+ A ocupação de uma árvore B+ nunca deve ultrapassar 90% da sua capacidade. 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 February 24, 2012 19 / 45
Índices Índices Bitmap Os índices bitmap são utilizados em colunas com poucos valores diferentes. Para cada valor possível é criado um bitmap contendo um 0 ou um 1 para cada tuplo da tabela dependendo do valor da coluna ser igual ao valor do bitmap. Utilizando operações extremamente rápidas, um índice bitmap é capaz de calcular quais os tuplos que tornam verdade uma expressão booleana. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 20 / 45
Índices Bitmap Índices André Restivo (FEUP) PostgreSQL Performance February 24, 2012 21 / 45
Índices Bitmap Índices André Restivo (FEUP) PostgreSQL Performance February 24, 2012 21 / 45
Índices Índices Bitmap Campo de indexação Masculino / Feminino t i = t = 30000 T i = 2 estados = 2 bits bfr i = 1024 * 8 / 2 = 4096 tuplos por bloco b i = 30000 / 4096 = 8 blocos André Restivo (FEUP) PostgreSQL Performance February 24, 2012 22 / 45
Full Text Search Índices Pesquisa em texto. Sem mais nenhum mecanismo: Podemos pesquisar por The mas não por five. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 23 / 45
Full Text Search Índices Separando o índice em palavras e retirando as maiúsculas. Podemos pesquisar por five mas não por ive. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 24 / 45
Full Text Search Índices Separando cada palavra nas suas terminações. Podemos pesquisar por pack. Podemos pesquisar por ack. Podemos pesquisar por pac. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 25 / 45
Full Text Search Índices 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 February 24, 2012 26 / 45
Índices Escolher Índices São criados índices nas chaves primárias e únicas automaticamente. Criar índices nos atributos pesquisados frequentemente em tabelas grandes. 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 February 24, 2012 27 / 45
Outline Planeamento 1 Armazenamento 2 Índices 3 Planeamento 4 PostgreSQL André Restivo (FEUP) PostgreSQL Performance February 24, 2012 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 February 24, 2012 29 / 45
Planos Alternativos Planeamento André Restivo (FEUP) PostgreSQL Performance February 24, 2012 30 / 45
Outline PostgreSQL 1 Armazenamento 2 Índices 3 Planeamento 4 PostgreSQL André Restivo (FEUP) PostgreSQL Performance February 24, 2012 31 / 45
Criar Índices PostgreSQL Sintaxe CREATE INDEX name ON table ( 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 February 24, 2012 32 / 45
PostgreSQL Índices Multi-coluna Sintaxe CREATE INDEX idxname ON tablename ( 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 February 24, 2012 33 / 45
PostgreSQL Índices Únicos Sintaxe CREATE UNIQUE INDEX idxname ON tablename ( column ) ; Garantem que não existem repetidos. Unique Keys são açucar sintático. André Restivo (FEUP) PostgreSQL Performance February 24, 2012 34 / 45
PostgreSQL Índices Parciais Sintaxe CREATE INDEX idxname ON tablename ( 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 type = ADMIN ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 35 / 45
Índices Únicos Parciais PostgreSQL Sintaxe CREATE UNIQUE INDEX idxname ON tablename ( column ) WHERE c o n d i t i o n ; Permitem criar restrições que de outra forma tinham de ser feitas usando triggers. Exemplo CREATE UNIQUE INDEX admin_department_idx ON people ( dep_id ) WHERE type = ADMIN ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 36 / 45
PostgreSQL Índices Sobre Funções Sintaxe CREATE INDEX idxname ON tablename ( 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 uma coluna, mas sim por o resultado de uma função. Exemplo CREATE INDEX d i f f e r e n c e _ i d x ON 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 s WHERE c r e d i t d e b i t > 1000; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 37 / 45
PostgreSQL Índices Sobre Funções Sintaxe CREATE INDEX idxname ON tablename ( 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 uma coluna, mas sim por o resultado de uma função. Exemplo CREATE INDEX name_lower_idx ON people ( l o w e r c a s e (name ) ) ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 38 / 45
PostgreSQL Clustering Sintaxe Em PostgreSQL não existem índices clustered. É no entanto possível organizar os tuplos de uma tabela periodicamente 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. CLUSTER tablename USING idxname ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 39 / 45
PostgreSQL Full Text Search Sintaxe Usar índices do tipo gin ou gist. Os índices são índices sobre expressões. Usar a mesma expressão nas perguntas. CREATE INDEX idxname ON tablename USING gin ( t o _ t s v e c t o r ( e n g l i s h, column ) ) ; Sintaxe SELECT FROM tablename WHERE t o _ t s v e c t o r ( e n g l i s h, column ) @@ to_tsquery ( s e a r c h & term ) ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 40 / 45
Full Text Search Ranking PostgreSQL Sintaxe SELECT column, ts_rank ( t o _ t s v e c t o r ( e n g l i s h, column ), to_tsquery ( s e a r c h & term ) ) FROM tablename WHERE t o _ t s v e c t o r ( e n g l i s h, column ) @@ to_tsquery ( s e a r c h & term ) ORDER BY ts_rank ( t o _ t s v e c t o r ( e n g l i s h, column ), to_tsquery ( s e a r c h & term ) ) DESC André Restivo (FEUP) PostgreSQL Performance February 24, 2012 41 / 45
PostgreSQL Explain Sintaxe Mostra o plano que o PostgreSQL pensa utilizar para uma determinada query. Pode não ser o plano efectivamente usado (estatísticas podem estar erradas). EXPLAIN query ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 42 / 45
PostgreSQL Explain Analyze Sintaxe Mostra o plano que o PostgreSQL pensa utilizar para uma determinada query e o realmente utilizado. Executa mesmo a query. EXPLAIN ANALYZE query ; André Restivo (FEUP) PostgreSQL Performance February 24, 2012 43 / 45
Analyze e Explain PostgreSQL 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 February 24, 2012 44 / 45
PostgreSQL Reindex, Vacuum e Analyze Sintaxe Comandos que devem ser usados periodicamente: Reindex - Reorganiza um índice. Vaccum - Recupera espaço desperdiçado. Analyze - Calcula estatísticas. REINDEX [ idxname tablename ] ; ANALYZE [ tablename ] ; VACUUM [ANALYZE] [ table ] André Restivo (FEUP) PostgreSQL Performance February 24, 2012 45 / 45