35
Afinação da Aplicação (versão 2015) Administração de Bases de Dados Carlos Pampulim Caldeira http://www.di.uevora.pt/~ccaldeira http://www.linkedin.com/in/carlospampulimcaldeira

Afinação da Aplicação | Caminho de Acesso aos Dados

Embed Size (px)

Citation preview

Page 1: Afinação da Aplicação | Caminho de Acesso aos Dados

Afinação da Aplicação(versão 2015)

Administração de Bases de Dados

Carlos Pampulim Caldeirahttp://www.di.uevora.pt/~ccaldeira

http://www.linkedin.com/in/carlospampulimcaldeira

Page 2: Afinação da Aplicação | Caminho de Acesso aos Dados

Optimizador Relacional

Permite a adaptação do SQL ao ambiente dinâmico da base de dados:Tabelas crescem / diminuemÍndices adicionados / removidosBase dados fragmentada / desfragmentada

Page 3: Afinação da Aplicação | Caminho de Acesso aos Dados

Optimizador Relacional

Page 4: Afinação da Aplicação | Caminho de Acesso aos Dados

Ver Is de um índice

CREATE INDEX "idx_nome" on "Terrorista Actos"("Nome");Log: Index idx_nome created.____________ “ ___________

EXEC DBMS_STATS.GATHER_TABLE_STATS ('ccaldeira', 'Terrorista Actos', cascade => TRUE);

Page 5: Afinação da Aplicação | Caminho de Acesso aos Dados

Ver Is de um índice

Page 6: Afinação da Aplicação | Caminho de Acesso aos Dados

Ver Is de um índice

SELECT distinct_keys FROM user_indexesWHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome';Resultado da query:

SELECT num_rows FROM user_tablesWHERE table_name = 'Terrorista Actos';

Page 7: Afinação da Aplicação | Caminho de Acesso aos Dados

Ver Is de um índice

SELECT (SELECT distinct_keys FROM user_indexes WHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome') AS distintos,(SELECT num_rows FROM user_tablesWHERE table_name = 'Terrorista Actos') AS linhas FROM lamy;

Page 8: Afinação da Aplicação | Caminho de Acesso aos Dados

Ver Is de um índice

Page 9: Afinação da Aplicação | Caminho de Acesso aos Dados

Ver Is de um índice

SELECT (SELECT distinct_keys FROM user_indexes WHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome') AS distintos,(SELECT num_rows FROM user_tablesWHERE table_name = 'Terrorista Actos') AS linhas FROM lamy;

Page 10: Afinação da Aplicação | Caminho de Acesso aos Dados

Selectividade do Índice

Taxa de duplicação numa coluna indexada. Selectividade ideal é 1, apenas alcançável em índices únicos.

Is = total valores distintos / número de linhas da tabela

Ex. Boa selectividade: 88 000 /100 000 = 0.88

Is < 0,1

Page 11: Afinação da Aplicação | Caminho de Acesso aos Dados

Medição: Selectividade do ÍndiceSELECT COUNT (DISTINCT “Disciplina”)

“Valores distintos” FROM disciplina;Valores distintos---------------              5SELECT COUNT(*) “Nº Total Linhas” FROM disciplina;Nº Total Linhas-----------------               14Is = 5 / 14

= 0,35(714…)

Page 12: Afinação da Aplicação | Caminho de Acesso aos Dados

Cardinalidade[Código Postal] Quantos distintos haverá em PT?Valores distintos---------------      1000?Se tiver uma tabela com registo de 10 milhões de licenças de condução?Selectividade = 1000 / 10 000 000Is = 0,0001 (=0,01%)

Medição: Selectividade do Índice

Page 13: Afinação da Aplicação | Caminho de Acesso aos Dados

Ajuda a decidir entre:• B*Tree• Bitmap

1.Se SELECTIVIDADE > 4% é B*Tree2.Se SELECTIVIDADE < 4% é Bitmap

Os índices, com uma selectividade inferior a 0,1%, devem ser do tipo Bitmap pois caso contrário nem serão levados em consideração pelo optimizador relacional.

Medição: Selectividade do Índice

Page 14: Afinação da Aplicação | Caminho de Acesso aos Dados

Auditoria aos índices em uso (Oracle)

SELECT INDEX_NAME "Nome", DISTINCT_KEYS / NUM_ROWS * 100 "SELECTIVITY %", NUM_ROWS, DISTINCT_KEYS "DISTINCT", LEAF_BLOCKS, CLUSTERING_FACTOR, BLEVEL "LEVEL", AVG_LEAF_BLOCKS_PER_KEY "ALFBPKEY"FROM DBA_INDEXESWHERE DISTINCT_KEYS / NUM_ROWS < .1 AND NUM_ROWS > 0ORDER BY "SELECTIVITY %" DESC;

Medição: Selectividade do Índice

Page 15: Afinação da Aplicação | Caminho de Acesso aos Dados

Densidade do Índice

Percentagem de duplicados numa coluna indexada

Nº médio linhas = Total linhas x Densidade

Nº médio linhas = 1000 x 0,5 = 500

SELECT column_name, num_distinct, density FROM dba_tab_col_statisticsWHERE table_name = 'Terrorista Actos';

Page 16: Afinação da Aplicação | Caminho de Acesso aos Dados

Densidade do Índice

Page 17: Afinação da Aplicação | Caminho de Acesso aos Dados

Joins

Dois métodos de join:Join em ciclo (nested-loop join)

uma linha é identificada na tabela outer e em seguida a tabela inner é varrida à procura de uma ligação e, assim sucessivamente até à última ocorrência na tabela outer.

Join combinado (merge-scan join)as linhas das tabelas são ordenadas e depois cada uma das tabelas é lida sequencialmente e as colunas coincidentes são assinaladas e as linhas devolvidas.

Page 18: Afinação da Aplicação | Caminho de Acesso aos Dados

Joins

Nº de tabelas na junção Nº de possíveis (ordens) de junções

1 1

2 2

3 6

4 24

5 120

6 720

7 5040

8 40320

9 363880

10 3628800

11 39916800

12 479001600

13 6227020800

14 87178291200

15 1307674368000

16 20922789888000

Page 19: Afinação da Aplicação | Caminho de Acesso aos Dados

Caminho de acesso aos dados

• não existe(m) índice(s) ou as condições [WHERE] excluem o(s) índice(s)

• grande número de linhas que satisfazem as condições

• índices com baixo clustering (index page cluster ratio)

• a tabela é demasiado pequena (poucas linhas)

Varrimento das tabelas:

Page 20: Afinação da Aplicação | Caminho de Acesso aos Dados

Acesso directo pelo índice (direct index lookup)

cargo função departamento

Caminho de acesso aos dados

SELECT número, apelido, nomeFROM empregadoWHERE cargo = “Gerente”AND função = 1AND departamento = “D01” ;

Page 21: Afinação da Aplicação | Caminho de Acesso aos Dados

Varrimento por comparação exacta (matching index scan)

Caminho de acesso aos dados

Varrimento do índice:

SELECT número, apelido, nomeFROM empregadoWHERE cargo = “Gerente”AND função = 1AND departamento = “D01” ;

Page 22: Afinação da Aplicação | Caminho de Acesso aos Dados

Varrimento por comparação exacta (matching index scan)

Caminho de acesso aos dadosVarrimento do índice:

Page 23: Afinação da Aplicação | Caminho de Acesso aos Dados

Varrimento pela posição relativa (nonmatching index scan)

Caminho de acesso aos dados

Não há predicado de entrada no índice, logo a estrutura do índice não pode ser utilizada.

SELECT número, apelido, nomeFROM empregadoWHERE função = 1AND departamento = “D01” ;

Varrimento do índice:

Page 24: Afinação da Aplicação | Caminho de Acesso aos Dados

Varrimento pela posição relativa (nonmatching index scan)

Caminho de acesso aos dadosVarrimento do índice:

Page 25: Afinação da Aplicação | Caminho de Acesso aos Dados

Caminho de acesso aos dados

Varrimento do índice:

• varrimento do índice > varrimento da tabela

Page 26: Afinação da Aplicação | Caminho de Acesso aos Dados

Caminho de acesso aos dados

Clustered (agrupado) ou unclustered:

• Índice agrupado: lê pág. dados uma única• Índice não agrupado: múltiplas leituras mesma pág. de

dados

A CP não é uma boa opção para ser um índice clustered pois além de por definição ser única, o acesso aos seus valores é aleatório enquanto que o clustered favorece o acesso sequencial.

Os índices agrupados ao lerem as páginas das folhas nunca lêm a mesma duas vezes. Já os índices não agrupados fazem múltiplos pedidos pois os dados estão dispersos.

Page 27: Afinação da Aplicação | Caminho de Acesso aos Dados

cargo função departamento salário

Caminho de acesso aos dados

Index screening:

matching

pos. relativo

SELECT número, apelidoFROM empregadoWHERE cargo = “Gerente”AND função = 1AND salário > 40000 ;

Page 28: Afinação da Aplicação | Caminho de Acesso aos Dados

Acesso restrito aos índices (index covering)

Caminho de acesso aos dados

cargo função departamento salário apelido número

SELECT número, apelidoFROM empregadoWHERE cargo = “Gerente”AND função = 1AND salário > 40000 ;

Page 29: Afinação da Aplicação | Caminho de Acesso aos Dados

Acesso restrito aos índices (index covering)

Caminho de acesso aos dados

• Não há I/O adicional à tabela• “Encorajar” o acesso index-only

• Sobrecarga de colunas indexadas

Page 30: Afinação da Aplicação | Caminho de Acesso aos Dados

Acesso múltiplo/combinado (multi-index access):

Caminho de acesso aos dados

cargo função

SELECT número, apelidoFROM empregadoWHERE cargo = “Gerente”AND função = 1 ;

Page 31: Afinação da Aplicação | Caminho de Acesso aos Dados

A utilização de índices para evitar SORT's:

DistinctUnionGroup byOrder by

Ordenação de dados

Page 32: Afinação da Aplicação | Caminho de Acesso aos Dados

O optimizador não utiliza o índice:

Desprezo pelo índice

• Sem predicados• Join com várias/muitas tabelas• Estatísticas desactualizadas

Page 33: Afinação da Aplicação | Caminho de Acesso aos Dados

Dois métodos:

Views: acesso

• View merging• View materialization

O view merging é o método mais eficiente. O SQL aplicado no DDL da view é aglutinado (merged) com o SQL que refere a view. O SQL resultante é então utilizado para determinar o caminho de acesso aos dados.

Quando não é possível combinar o SQL da view com o SQL que acede à view é criada uma tabela temporária que armazena os resultados da view. O SQL que acede à view é depois aplicado aos resultados guardados na tabela temporária. Daí a relativa ineficiência da view materialization.

Page 34: Afinação da Aplicação | Caminho de Acesso aos Dados

Alguns optimizadores:

Re(escrita) de queries

WHERE coluna1 >= 1 AND coluna1 <= 100 , podem transformar esta

cláusula nesta:

WHERE coluna1 BETWEEN 1 AND 100

Page 35: Afinação da Aplicação | Caminho de Acesso aos Dados

Re(escrita) de queries

transitividade do predicado (predicate transitive closure)

SELECT d."Nome do Departamento", e."Nome", e."Número de Funcionário"

FROM empregado e, departamento d

WHERE e."Código do Departamento" = d."Código do Departamento"

AND d."Código do Departamento" = "DO59";

SELECT d."Nome do Departamento", e."Nome", e."Número de Funcionário"

FROM empregado e, departamento d

WHERE e."Código do Departamento" = d."Código do Departamento"

AND e."Código do Departamento" = "DO59";