MÓDULO 4 - PERFORMANCE

⚡ Performance e Tuning

Diagnóstico, otimização de SQL e tuning interno

📄

Você está no Conteúdo Compacto

Resumo da trilha em uma única página

Ver Conteúdo Completo
5
Seções
5
Exercícios
AWR
Diagnóstico
Expert
Nível

Introdução

Um banco de dados que funciona é bom, mas um banco de dados rápido é essencial. Otimização de desempenho, ou tuning, é uma das disciplinas mais desafiadoras e valorizadas de um DBA. Vamos aprender a diagnosticar gargalos, otimizar SQL e ajustar componentes internos.

🔍

4.1 Diagnóstico de Performance

Onde começar quando "o sistema está lento"

AWR

Automatic Workload Repository. Coleta estatísticas de desempenho continuamente. Snapshots de hora em hora.

Relatório AWR

Documento HTML detalhado: queries mais "caras", eventos de espera, etc. Habilidade fundamental!

ASH

Active Session History. Amostra atividade a cada segundo. Diagnóstico granular de problemas transitórios.

ADDM

Automatic Database Diagnostic Monitor. Analisa AWR e gera recomendações automáticas.

📊

4.2 Tuning de SQL: Plano de Execução

A "receita" do otimizador

O Plano de Execução é a "receita" que o Otimizador Oracle cria para buscar dados. Descreve os passos: qual tabela primeiro, se usa índice, como faz o join, etc.

Full Table Scan

Oracle lê tabela inteira para encontrar poucas linhas. Sinal de índice faltando ou não usado.

Tipo de Join Inadequado

Oracle pode escolher Nested Loops, Hash Join ou Sort Merge que não é ideal para o volume de dados.

Gerando o Plano de Execução

-- Gerar plano de execução
EXPLAIN PLAN FOR
SELECT * FROM HR.EMPLOYEES WHERE LAST_NAME = 'Smith';

-- Visualizar o plano
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
📚

4.3 Índices: Acelere suas Consultas

O "índice do livro" para seus dados

Um índice é uma estrutura de dados separada que "aponta" para as linhas de uma tabela. Permite encontrar dados rapidamente sem ler a tabela inteira.

✓ Quando Criar Índice

  • • Colunas frequentemente usadas no WHERE
  • • Colunas usadas em JOINs
  • • Colunas com alta seletividade

✗ Quando NÃO Criar

  • • Tabelas pequenas
  • • Colunas com muitos valores duplicados
  • • Tabelas com muito INSERT/UPDATE/DELETE
-- Criar um índice na coluna DEPT_ID
CREATE INDEX idx_emp_dept_id ON EMPREGADOS(DEPT_ID);
🧠

4.4 Gestão de Memória e Tuning Interno

SGA, PGA e AMM

Tuning da SGA

Aumentar Buffer Cache reduz I/O. Aumentar Shared Pool acelera parsing.

Tuning da PGA

Melhora sorts e hash joins, evitando uso de disco (tablespace temporário).

Gestão Automática de Memória (AMM)

A partir do Oracle 11g, defina apenas MEMORY_TARGET e o Oracle gerencia dinamicamente SGA/PGA.

🛠️

4.5 Ferramentas de Diagnóstico

SQL Tuning Advisor e SQL Trace

SQL Tuning Advisor

Analisa query de alta carga e fornece recomendações: criar índice, coletar estatísticas, reescrever query.

SQL Trace e TKPROF

Habilita trace de sessão. TKPROF formata em relatório legível com plano de execução, tempos de CPU, I/O.

📝

Exercícios Práticos

Performance e Tuning

1. Identificando Query Lenta

Gere o plano de execução para: SELECT * FROM HR.EMPLOYEES WHERE LAST_NAME = 'Smith';

2. Criando um Índice

Crie índice para acelerar a query anterior. Gere o plano novamente e compare.

3. Coletando Estatísticas

Execute DBMS_STATS.GATHER_TABLE_STATS para HR.EMPLOYEES.

4. Analisando um Join

Gere plano para query com JOIN entre EMPLOYEES e DEPARTMENTS. Identifique método de join.

5. Relatório AWR (Opcional)

Se tiver Diagnostic Pack, gere um relatório AWR e identifique "SQL ordered by Elapsed Time".

📋 Ver Gabarito dos Exercícios

1. Plano de Execução

EXPLAIN PLAN FOR
SELECT * FROM HR.EMPLOYEES WHERE LAST_NAME = 'Smith';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- Esperado: TABLE ACCESS FULL (sem índice)

2. Criando Índice

CREATE INDEX idx_emp_last_name ON HR.EMPLOYEES(LAST_NAME);

-- Gerar plano novamente
-- Esperado: INDEX RANGE SCAN + TABLE ACCESS BY INDEX ROWID

3. Coletando Estatísticas

EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');

4. Analisando Join

EXPLAIN PLAN FOR
SELECT e.FIRST_NAME, e.LAST_NAME, d.DEPARTMENT_NAME
FROM HR.EMPLOYEES e
JOIN HR.DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE d.DEPARTMENT_NAME = 'Sales';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- Procure: NESTED LOOPS, HASH JOIN ou SORT MERGE JOIN

🎉 Módulo 4 Concluído!

Você domina diagnóstico e tuning! Último módulo: Alta Disponibilidade e Clusters!