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

189 visualizações

Publicada em

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

Publicada em: Software
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
189
No SlideShare
0
A partir de incorporações
0
Número de incorporações
27
Ações
Compartilhamentos
0
Downloads
3
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. 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
  2. 2. Optimizador Relacional Permite a adaptação do SQL ao ambiente dinâmico da base de dados: Tabelas crescem / diminuem Índices adicionados / removidos Base dados fragmentada / desfragmentada
  3. 3. Optimizador Relacional
  4. 4. 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);
  5. 5. Ver Is de um índice
  6. 6. Ver Is de um índice SELECT distinct_keys FROM user_indexes WHERE table_name = 'Terrorista Actos' AND index_name = 'idx_nome'; Resultado da query: SELECT num_rows FROM user_tables WHERE table_name = 'Terrorista Actos';
  7. 7. 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_tables WHERE table_name = 'Terrorista Actos') AS linhas FROM lamy;
  8. 8. Ver Is de um índice
  9. 9. 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_tables WHERE table_name = 'Terrorista Actos') AS linhas FROM lamy;
  10. 10. 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
  11. 11. Medição: Selectividade do Índice SELECT COUNT (DISTINCT “Disciplina”) “Valores distintos” FROM disciplina; Valores distintos ---------------               5 SELECT COUNT(*) “Nº Total Linhas” FROM disciplina; Nº Total Linhas -----------------                14 Is = 5 / 14 = 0,35(714…)
  12. 12. 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 000 Is = 0,0001 (=0,01%) Medição: Selectividade do Índice
  13. 13. Ajuda a decidir entre: • B*Tree • Bitmap 1.Se SELECTIVIDADE > 4% é B*Tree 2.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
  14. 14. 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_INDEXES WHERE DISTINCT_KEYS / NUM_ROWS < .1 AND NUM_ROWS > 0 ORDER BY "SELECTIVITY %" DESC; Medição: Selectividade do Índice
  15. 15. 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_statistics WHERE table_name = 'Terrorista Actos';
  16. 16. Densidade do Índice
  17. 17. 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.
  18. 18. 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
  19. 19. 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:
  20. 20. Acesso directo pelo índice (direct index lookup) cargo função departamento Caminho de acesso aos dados SELECT número, apelido, nome FROM empregado WHERE cargo = “Gerente” AND função = 1 AND departamento = “D01” ;
  21. 21. Varrimento por comparação exacta (matching index scan) Caminho de acesso aos dados Varrimento do índice: SELECT número, apelido, nome FROM empregado WHERE cargo = “Gerente” AND função = 1 AND departamento = “D01” ;
  22. 22. Varrimento por comparação exacta (matching index scan) Caminho de acesso aos dados Varrimento do índice:
  23. 23. 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, nome FROM empregado WHERE função = 1 AND departamento = “D01” ; Varrimento do índice:
  24. 24. Varrimento pela posição relativa (nonmatching index scan) Caminho de acesso aos dados Varrimento do índice:
  25. 25. Caminho de acesso aos dados Varrimento do índice: • varrimento do índice > varrimento da tabela
  26. 26. 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.
  27. 27. cargo função departamento salário Caminho de acesso aos dados Index screening: matching pos. relativo SELECT número, apelido FROM empregado WHERE cargo = “Gerente” AND função = 1 AND salário > 40000 ;
  28. 28. Acesso restrito aos índices (index covering) Caminho de acesso aos dados cargo função departamento salário apelido número SELECT número, apelido FROM empregado WHERE cargo = “Gerente” AND função = 1 AND salário > 40000 ;
  29. 29. 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
  30. 30. Acesso múltiplo/combinado (multi-index access): Caminho de acesso aos dados cargo função SELECT número, apelido FROM empregado WHERE cargo = “Gerente” AND função = 1 ;
  31. 31. A utilização de índices para evitar SORT's: Distinct Union Group by Order by Ordenação de dados
  32. 32. O optimizador não utiliza o índice: Desprezo pelo índice • Sem predicados • Join com várias/muitas tabelas • Estatísticas desactualizadas
  33. 33. 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.
  34. 34. Alguns optimizadores: Re(escrita) de queries WHERE coluna1 >= 1 AND coluna1 <= 100 , podem transformar esta cláusula nesta: WHERE coluna1 BETWEEN 1 AND 100
  35. 35. 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";

×