30 Dicas Essenciais de SQL e Banco de Dados Oracle
Dicas SQL Oracle.
🟢 Fundamentos de SQL
- Evite
SELECT *em produção UsarSELECT *traz todas as colunas, mesmo as que não são necessárias, aumentando tráfego e consumo de recursos.SELECT nome, salario FROM funcionarios; - Use aliases para clareza Aliases tornam consultas mais legíveis e facilitam quando há joins.
SELECT f.nome AS funcionario, d.nome AS departamento FROM funcionarios f JOIN departamentos d ON f.dept_id = d.id; - Cuidado com
DISTINCTRemove duplicados, mas pode ser pesado em tabelas grandes.SELECT DISTINCT dept_id FROM funcionarios; - Nomeie colunas calculadas Isso facilita a leitura e uso posterior da coluna.
SELECT salario * 12 AS salario_anual FROM funcionarios; - Consistência em maiúsculas/minúsculas SQL não diferencia, mas manter padrão ajuda na manutenção.
SELECT Nome FROM Funcionarios;
🔗 Joins e Relacionamentos
- INNER JOIN Retorna apenas registros que têm correspondência em ambas as tabelas.
SELECT f.nome, d.nome FROM funcionarios f INNER JOIN departamentos d ON f.dept_id = d.id; - LEFT JOIN Retorna todos os registros da tabela da esquerda, mesmo sem correspondência.
SELECT f.nome, d.nome FROM funcionarios f LEFT JOIN departamentos d ON f.dept_id = d.id; - Simplifique joins Evite múltiplos joins sem necessidade, pois aumentam complexidade e tempo de execução.
- Use
EXISTSem vez deINEXISTSgeralmente é mais eficiente em subconsultas.SELECT nome FROM funcionarios f WHERE EXISTS (SELECT 1 FROM projetos p WHERE p.func_id = f.id); - Organize com CTE (
WITH) Estrutura consultas complexas em blocos mais legíveis.
WITH salarios AS (
SELECT dept_id, AVG(salario) AS media
FROM funcionarios GROUP BY dept_id
)
SELECT * FROM salarios WHERE media > 5000;
⚡ Performance e Otimização
- Crie índices Índices aceleram buscas em colunas usadas em filtros.
CREATE INDEX idx_func_salario ON funcionarios(salario);
- Analise planos de execução Permite entender como o Oracle executa a query.
EXPLAIN PLAN FOR SELECT * FROM funcionarios WHERE salario > 5000;
- Evite funções em colunas indexadas Funções podem invalidar o uso do índice. Prefira intervalos.
SELECT * FROM funcionarios
WHERE data BETWEEN DATE '2026-02-20' AND DATE '2026-02-20' + 1 - INTERVAL '1' SECOND;
- Limite resultados Evita trazer dados desnecessários.
SELECT * FROM funcionarios WHERE salario > 5000 AND ROWNUM <= 10;
- Use
BULK COLLECTem PL/SQL Carrega grandes volumes de dados em memória de forma eficiente.
DECLARE
TYPE t_func IS TABLE OF funcionarios%ROWTYPE;
v_func t_func;
BEGIN
SELECT * BULK COLLECT INTO v_func FROM funcionarios;
END;
📊 Funções e Manipulação de Dados
- Funções de string Manipule textos facilmente.
SELECT SUBSTR(nome,1,5), INSTR(nome,'a'), TRIM(nome) FROM funcionarios;
- Funções de data Trabalhe com datas de forma prática.
SELECT SYSDATE, ADD_MONTHS(SYSDATE,1), TRUNC(SYSDATE,'MM') FROM dual;
- Funções analíticas Úteis para ranking e análises avançadas.
SELECT nome, salario,
RANK() OVER (ORDER BY salario DESC) AS ranking
FROM funcionarios;
- CASE WHEN Adicione lógica condicional diretamente na query.
SELECT nome,
CASE WHEN salario > 5000 THEN 'Alto'
ELSE 'Normal' END AS faixa
FROM funcionarios;
- GROUP BY com agregações Resuma dados por grupos.
SELECT dept_id, AVG(salario) FROM funcionarios GROUP BY dept_id;
🔒 Segurança e Boas Práticas
- Hashing de senhas Nunca armazene senhas em texto puro.
SELECT DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW('senha123'), 2) FROM dual;
- Controle de permissões Restrinja acesso conforme necessidade.
GRANT SELECT ON funcionarios TO analista;
- Evite SQL Injection Use bind variables em PL/SQL.
EXECUTE IMMEDIATE 'SELECT * FROM funcionarios WHERE id = :id' USING v_id;
- Views para restringir acesso Crie visões com dados limitados.
CREATE VIEW vw_funcionarios_publicos AS
SELECT nome, dept_id FROM funcionarios;
- Documente queries críticas Comentários ajudam na manutenção.
-- Consulta para relatório mensal de salários
SELECT dept_id, AVG(salario) FROM funcionarios GROUP BY dept_id;
🛠️ Administração Oracle
- Monitore sessões Identifique usuários conectados.
SELECT * FROM V$SESSION WHERE username IS NOT NULL;
- Atualize estatísticas Melhora o otimizador de consultas.
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','FUNCIONARIOS');
- Gerencie tablespaces Organize dados em diferentes áreas de armazenamento.
CREATE TABLE funcionarios (
id NUMBER,
nome VARCHAR2(100)
) TABLESPACE dados_func;
- Partitioning em tabelas grandes Divide dados em partes menores para performance.
CREATE TABLE vendas (
id NUMBER,
data DATE,
valor NUMBER
)
PARTITION BY RANGE (data) (
PARTITION p2025 VALUES LESS THAN (DATE '2026-01-01'),
PARTITION p2026 VALUES LESS THAN (DATE '2027-01-01')
);
- Automatize com DBMS_SCHEDULER Crie jobs automáticos para tarefas recorrentes.
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'backup_diario',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN backup_procedure; END;',
start_date => SYSDATE,
repeat_interval => 'FREQ=DAILY;BYHOUR=2',
enabled => TRUE
);
END;
Conclusão
Agora cada dica vem acompanhada de explicação e comando, tornando o artigo um guia prático e completo. O leitor não apenas entende a teoria, mas já tem exemplos prontos para aplicar no Oracle Database.
Consulte também: Tudo sobre SQL
