Afinação da Aplicação | Caminho de Acesso aos Dados
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. 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
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);
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. 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;
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. 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. 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. 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. 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. 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. 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';
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.
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. 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. 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. Varrimento por comparação exacta
(matching index scan)
Caminho de acesso aos dados
Varrimento do índice:
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. Varrimento pela posição relativa
(nonmatching index scan)
Caminho de acesso aos dados
Varrimento do índice:
25. Caminho de acesso aos dados
Varrimento do índice:
• varrimento do índice > varrimento da tabela
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. 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. 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. 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. 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. A utilização de índices para evitar SORT's:
Distinct
Union
Group by
Order by
Ordenação de dados
32. O optimizador não utiliza o índice:
Desprezo pelo índice
• Sem predicados
• Join com várias/muitas tabelas
• Estatísticas desactualizadas
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. 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. 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";