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

Post on 27-Jul-2015

53 views 1 download

Transcript of 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

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";