Certamente você como DBA já viu varias vezes determinadas consultas SQL se recusando a cooperar. Em outras palavras, a consulta SQL deveria utilizar o índice1 mais opta por utilizar o índice2 o que algumas vezes deixa a performance da SQL um lixo, literalmente.
Vários fatores podem estar provocando a seleção incorreta deste índice no plano de execução, coleta de estatísticas, parametrizações, entre outas. Contudo, alterá-las nem sempre é algo fácil pois podemos afetar diretamente a performance de outras consultas SQL assim como a performance de toda a base de dados (no caso de uma parametrização incorreta, por exemplo).
Utilizar um Hint? Sim… ou NÃO! As vezes não temos o acesso ao “código fonte” e solicitar ao fornecedor da aplicação o ajuste pode demorar.
Para contornar esta situação de forma rápida podemos criar um perfil SQL (SQL Profile). A abordagem de perfil SQL apareceu na versão 10g e permite a partir de então que “melhorias” sejam agregadas a uma instrução SQL sem que seu código fonte seja alterado.
Os perfis SQL são armazenados no dicionário de dados e podem conter detalhes de comparação de cardinalidade, seletividade de predicado, parâmetros e índices específicos. Tudo para melhorar o desempenho de uma instrução SQL.
Normalmente temos contato com um perfil SQL quando executamos um SQL Tuning Advisor que dentre algumas recomendações oferece a implementação de um SQL Profile para ganhos de performance (imagem abaixo).
sql profile1 Criando e gerenciando SQL Profiles
Na versão 11g com o surgimento das tarefas automatizadas de manutenção do banco de dados (DBMS_AUTO_TASK_ADMIN) temos o Automatic SQL Tuning Advisor que automaticamente identifica e tenta ajustar SQLs menos performaticos aceitando a utilização de SQL Profiles caso a opção ACCEPT_SQL_PROFILES for TRUE. Mas isto não vem a caso no momento, pois vamos implementar manualmente nosso próprio SQL Profile em uma instrução SQL.

O Particionamento é uma solução oferecida na versão Enterprise Edition(EE) – With Partitioning, mediante licenciamento, que permite particionarmos tabelas e índices em pedaços menores simplificando sua administração e melhorando o desempenho de consultas.
A Oracle oferece alguns métodos de particionamento, como podemos verificar abaixo:
Range Partitioning: Particionamento por intervalos. É o tipo mais comum de particionamento e normalmente utilizado sobre datas;
List Partitioning: Particionamento em listas, onde podemos especificar uma lista de valores atribuidos à cada partição;
Hash Partitioning: Particionamento em faixas, normalmente dados que não encaixam no formato de particionamento de listas ou ranges;
Composite Partitioning: Particionamento composto por partições range e sub-partições (list ou hash).
Neste artigo irei demonstrar como podemos particionar uma tabela já existente utilizando o modelo range(intervalo) através da package DBMS_REDEFINITION existente desde a versão 9i e que permite uma redefinição ONLINE de tabelas.

Em um artigo passado, Uso e gerenciamento dos ocupantes da SYXAUX, havíamos falado sobre o SM/OPTSTAT cuja feature introduzida na versão 10G armazena versões mais velhas do otimizador de estatísticas o que nos permite restaurá-las caso seja encontrado alguma agressão com o novo plano de execução em função de uma nova coleta de estatística, por exemplo.

Pois bem, hoje iremos demonstrar como podemos restaurar estas estatísticas antigas armazenadas na SM/OPTSTAT.

O GUOB traz mais uma vez o evento Real World Performance, sendo realizado no Centro de Convenções RB1 no Rio de Janeiro.
 
O evento acontecerá no dia 02/04/2013, durante todo o dia. Uma excelente oportunidade de passar o dia com grandes nomes da Comunidade Oracle no mundo:
 
Tom Kyte, autor do popular site AskTom Blog
Andrew Holdsworth, Líder do Time da Oracle Real World Database Performance e
Graham Wood, renomado arquiteto em Oracle Database Performance.
 
Trazendo discussões, debates e demostrações, eles irão mostrar para você os principais tópicos em engenharia de performance como:

- Melhores práticas em desenhos de arquitetura de hardware e como melhor e consertar problemas de arquitetura.

- Como desenvolver aplicações para entregar rápidas melhorias de performance sem sacrificar hardware.

- Novo em 2013! As novidades no Oracle Enterprise Manager 12c, Exadata X3 e o que essas tecnologias significam para seus atuais sistemas.

Não muito conhecido, porém útil, o Oracle Error(OERR) é um utilitário que compõe a instalação do produto Oracle nas plataformas Linux e Unix. É um shell script localizado no diretório $ORACLE_HOME/bin que permite pesquisar nos arquivos Oracle messages (.msg) e exibir a causa e a ação para os erros pesquisados, como neste exemplo:

[oracle@orcl ~]$ export ORACLE_HOME=/u02/app/oracle/product/10.2/db_1
[oracle@orcl ~]$ oerr ora 1555
01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small"
// *Cause: rollback records needed by a reader for consistent read are
//         overwritten by other writers
// *Action: If in Automatic Undo Management mode, increase undo_retention
//          setting. Otherwise, use larger rollback segments
[oracle@orcl ~]$

Sua syntaxe é composta pelo facility(digamos "código") e error(número do erro):

Continue lendo mais em oraclehome.com.br

Alguns dias atrás estava precisando monitorar uma tabela da aplicação do cliente para registrar a quantidade de operações DML que ela estava sofrendo.
 
Após algumas buscas encontrei a tabela do Oracle DBA_TAB_MODIFICATIONS que conforme documentação registra as modificações sofridas nas tabelas do banco de dados após a ultima coleta de estatisticas, ou seja, a cada nova coleta de estatistica sobre a tabela seus registros na DBA_TAB_MODIFICATIONS são descartados(zerados!).

Continue lendo mais em oraclehome.com.br

Na vida de um DBA ajustar parâmetros do banco de dados é algo rotineiro, mas como bem sabemos nem sempre somos os únicos a fazer os ajustes.

Muitas vezes um banco de dados é alterado por varias pessoas (DBA, desenvolvimento, usuário…) e mesmo que estas alterações sejam justificadas internamente a longo prazo podemos necessitar identificar o motivo pelo qual o parâmetro foi alterado.

E agora que “NINGUÉM” alterou como descobrimos o motivo do ajuste?