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
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
Optimizador Relacional
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);
Ver Is de um índice
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';
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;
Ver Is de um índice
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;
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
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…)
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
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
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
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';
Densidade do Índice
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.
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
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:
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” ;
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” ;
Varrimento por comparação exacta (matching index scan)
Caminho de acesso aos dadosVarrimento do índice:
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:
Varrimento pela posição relativa (nonmatching index scan)
Caminho de acesso aos dadosVarrimento do índice:
Caminho de acesso aos dados
Varrimento do índice:
• varrimento do índice > varrimento da tabela
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.
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 ;
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 ;
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
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 ;
A utilização de índices para evitar SORT's:
DistinctUnionGroup byOrder by
Ordenação de dados
O optimizador não utiliza o índice:
Desprezo pelo índice
• Sem predicados• Join com várias/muitas tabelas• Estatísticas desactualizadas
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.
Alguns optimizadores:
Re(escrita) de queries
WHERE coluna1 >= 1 AND coluna1 <= 100 , podem transformar esta
cláusula nesta:
WHERE coluna1 BETWEEN 1 AND 100
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";
Top Related