25
MATA60 BANCO DE DADOS Aula 10- Indexação Prof. Daniela Barreiro Claro

MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

MATA60 – BANCO DE DADOS Aula 10- Indexação

Prof. Daniela Barreiro Claro

Page 2: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação em SQL;

Vantagens e Custo dos Índices;

Indexação no PostgreSQL;

Indexação

2 de X; X=23 FORMAS - UFBA

Page 3: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Sintaxe:

create [unique] index <nome_indice> on <nome_relação> (<lista atributos>)

Exemplo:

create index meu_indice on agencia(nome_agencia)

O atributo unique exige que a chave de procura seja uma chave candidata (não

duplicada).

Para remover um índice faz-se:

drop index <nome_índice>

Indexação

3 de X FORMAS - UFBA

Page 4: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

CREATE UNIQUE INDEX nome_indice ON tabela (coluna)

Entretanto, é mais aconselhável utilizar CONSTRAINTs para impor esse tipo de

restrição de unicidade.

Exemplo:

CREATE TABLE usuario(

cpf int,

nome varchar,

CONSTRAINT constraint_exemplo UNIQUE (cpf)

) ;

Indices únicos

4 de X FORMAS - UFBA

Page 5: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Quando uma tabela não tem índices, os seus registros são desordenados e uma

consulta terá que percorrer todos os registros;

O uso de índices pode ainda ser mais valioso em consultas envolvendo joins ou

múltiplas tabelas:

Consultas em uma tabela:

o número de valores que precisam ser examinados por coluna é o número de registros da tabela.

Em consultas em múltiplas tabelas,

o número de possíveis combinações aumenta.

Benefícios

5 de X FORMAS - UFBA

Page 6: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Exemplo: Suponha que existam três tabelas

sem índices, t1, t2 e t3, cada uma contendo as colunas c1, c2 e c3,

respectivamente, e cada coluna contenha 1.000 registros com dados de 1 a

1.000. Suponha ainda a consulta abaixo:

SELECT t1.c1, t2.c2, t3.c3

FROM t1

INNER JOIN t2 ON t1.c1 = t2.c2

INNER JOIN t3 ON t2.c2 = t3.c3;

Benefícios

6 de X FORMAS - UFBA

Page 7: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

O resultado desta consulta deve ser uma tabela de 1.000

registros, cada um contendo três valores iguais. Se a consulta for

executada sem o uso de índices, todas tuplas têm que ser

percorridas. Consequentemente, o banco tenta todas as

combinações possíveis para encontrar os registros que combinam

com a condição da cláusula WHERE. O número de possíveis

combinações é 1.000 x 1.000 x 1.000 = 1.000.000.000.

Benefícios

7 de X FORMAS - UFBA

Page 8: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

O uso de índices nas tabelas melhora o tempo de resposta da

consulta, pois permitem que consultas sejam assim processadas:

1. Selecione a primeira tupla da tabela t1 e veja o seu valor;

2. Usando o índice da tabela t2, vá diretamente à tupla que combine com o

valor de t1. Ainda, use o índice da tabela t3 para ir diretamente à tupla

que combine com o valor de t2;

3. Vá para o próximo registro da tabela t1 e repita o procedimento anterior.

Faça isto até que todas as linhas em t1 tenham sido examinadas.

Ainda há uma varredura completa da tabela t1, mas índices são usados nas

tabelas t2 e t3 para encontrar as tuplas diretamente.

Benefícios

8 de X

Page 9: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Há custos de espaço e tempo. Na prática, as desvantagens tendem

a serem minimizadas pelo valor das vantagens.

Índices aumentam a velocidade de consultas, mas tornam mais lentas as

operações de escrita (inserções, atualizações e remoções), pois gravar uma

tupla requer não apenas escrevê-la, mas também mudar a ordenação dos

índices.

Quanto mais índices houver em uma tabela, mais mudanças de ordenação

necessitam ser feitas, o que pode comprometer o desempenho.

Custo dos indices

9 de X

Page 10: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Índices devem ser criados em colunas usadas para pesquisa,

ordenação ou agrupamento, ou seja, nas que aparecem na

cláusula WHERE, em JOINs, ORDER BY ou GROUP BY.

Colunas que aparecem em cláusulas JOIN ou em expressões como

col1 = col2 na cláusula WHERE são fortes candidatas à criação de

um índice.

É importante utilizar índices em chaves estrangeiras, já que estas

são muito utilizados em JOINs.

Uso dos índices

10 de X

Page 11: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Em determinados casos, em que haja várias consultas que utilizem

os comandos ORDER BY, GROUP BY e DISTINCT é aconselhável

criar um índice para a coluna que está sendo utilizada nestas

consultas. Isso se deve ao fato de que cada vez que ocorre isto, o

SGBD dispara um SORT para ordenação dos dados, o que pode

comprometer o desempenho. Tendo índices para este caso, os

dados já poderão estar ordenados, implicando em economias no

processamento.

Uso dos índices

11 de X

Page 12: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Índices funcionam melhor em colunas que contenham um alto

número de valores distintos.

Mantenha, sempre que possível, chaves primárias pequenas (os

SGBDs criam um índice para cada chave primária).

Não crie índices em excesso. Índices devem ser atualizados e

reorganizados quando o conteúdo de uma tabela é modificado.

Logo, quanto mais índices, mais demorada será a atualização e a

ordenação.

Dicas

12 de X

Page 13: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Crie índices com valores pequenos. Use tipos de dados o menor possível. Por

exemplo, não use uma coluna BIGINT se MEDIUMINT suporta os dados que serão

armazenados. Não use CHAR(100) se nenhum dos valores armazenados

ultrapassa 25 caracteres.

Valores pequenos melhoram o processamento de índices de muitas maneiras:

Podem ser comparados mais rapidamente;

Ocupam menos espaço de disco nos arquivos de índices;

É possível a permanência de mais registros em cache, fazendo com que o

servidor tenha menos acessos a disco.

Dicas

13 de X

Page 14: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Se um índice é raramente ou nunca utilizado, este diminui, desnecessariamente, o

desempenho da tabela. Além disso, índices desnecessários podem fazer com que o

otimizador de consultas não escolha o melhor índice a ser usado.

As expressões de índice devem ser utilizadas somente quando as consultas que

usam o índice forem muito frequentes.

Dicas

14 de X

Page 15: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

CREATE INDEX nome_indice ON tabela_nome (coluna_nome);

Por padrão, ao criar um índice em PostgreSQL, se não for especificado seu tipo,

ele utiliza a estrutura B-Tree. Contudo, pode ser que ele escolha outro tipo,

dependendo dos operadores de comparação envolvidos:

Indexação no PostgreSQL

15 de X

Page 16: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Para escolher o tipo de índice deve-se acrescentar ao final o comando a

palavra USING, especificando o tipo desejado.

CREATE INDEX nome ON tabela USING HASH (coluna);

CREATE INDEX nome ON tabela USING BTREE (coluna);

CREATE INDEX nome ON tabela USING RTREE (coluna);

CREATE INDEX nome ON tabela USING GIST (coluna);

Indexação no PostgreSQL

16 de X

Page 17: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Estruturas de índices no PG

17 de X

Page 18: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação no PG

18 de X

Quando se utiliza mais de uma coluna, o índice é organizado de

acordo com a primeira coluna especificada na declaração, sendo

a segunda utilizada apenas quando a primeira coluna possuir

vários valores iguais. Portanto, a segunda coluna é usada como

uma segunda opção de classificação.

CREATE INDEX coluna1_coluna2_tabela_idx ON tabela

(coluna1,coluna2);

Page 19: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação no PG

19 de X

Quando utilizadas várias colunas em um índice, o otimizador de consultas pode

utilizar todas as colunas especificadas ou apenas uma ou algumas, de acordo

com sua decisão. Isto vai depender se as colunas são consecutivas.

Por exemplo, um índice incluindo (col_1, col_2, col_3) pode ser utilizado em

consultas envolvendo col_1, col_2 e col_3, ou em consultas envolvendo col_1 e

col_2, ou em consultas envolvendo apenas col_1, mas não em outras

combinações. (Em uma consulta envolvendo col_1 e col_3, o otimizador pode

decidir utilizar um índice para col_1 apenas, tratando col_3 como uma coluna

comum, não indexada).

Page 20: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação no PG

20 de X

Exemplo: Dada a criação do índice:

CREATE INDEX ano_valor_cliente_idx ON clientes USING BTREE (ano_nasc, valor_devido);

Considere as consultas abaixo:

SELECT nome FROM clientes WHERE ano_nasc > 1973 AND valor_devido < 1750;

SELECT nome FROM clientes WHERE ano_nasc > 1973 OR valor_devido < 1750;

No exemplo, apenas a primeira consulta usa o índice. Por definição, o

PostgreSQL utiliza apenas o índice com mais de uma coluna quando as colunas

estão unidas em uma cláusula WHERE por AND, em outros casos o índice vai ser

utilizado apenas na coluna que foi definida por primeiro na criação do índice.

Page 21: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação no PG

21 de X

Exemplo: Dada a criação do índice:

CREATE INDEX ano_valor_cliente_idx ON clientes USING BTREE (ano_nasc, valor_devido);

Considere as consultas abaixo:

SELECT nome FROM clientes WHERE ano_nasc > 1973 AND valor_devido < 1750;

SELECT nome FROM clientes WHERE ano_nasc > 1973 OR valor_devido < 1750;

Na segunda consulta o índice ano_valor_cliente_idx será usado apenas na busca

dos clientes nascidos após 1973, pela ano_nasc ser sua coluna principal.

Page 22: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação no PG

22 de X

O comando:

SELECT * FROM pg_stat_all_indexes

traz informações sobre os índices contidos no banco de dados, como o número total

de varreduras que utilizaram um determinado índice e o número de linhas lidas

pelo índice.

Page 23: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Indexação no PG

23 de X

Indexação é uma ferramenta importante para o aumento de desempenho das

consultas.

Use indexação como a primeira alternativa para obter um ganho de

desempenho e depois avalie que outras técnicas podem ser úteis.

Quando uma consulta demora a ser concluída, normalmente as tabelas

envolvidas não possuem índices ou estes foram mal criados. A adequação ou

criação dos índices necessários resolve o problema na grande maioria das vezes.

Page 24: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Referências

Livro: Korth

Notas de aula do Prof. Clodis Boscarioli

Page 25: MATA60 BANCO DE DADOSformas.ufba.br/dclaro/mata60/Aula 10 - Indexacao.pdfO resultado desta consulta deve ser uma tabela de 1.000 registros, cada um contendo três valores iguais. Se

Facebook: /formasresearchgroup Twitter: /formasresearch

Semantic Formalisms and Applications Research Group

FORMAS - UFBA

www.dcc.ufba.br/~dclaro

Disciplina: MATA60 (2016.1)