segunda-feira, 17 de outubro de 2011

Otimizando Aplicações Oracle


Melhorar a performance das aplicações Oracle depende também da forma com que você utiliza o banco e da arquitetura do servidor. Veja algumas técnicas interessantes...

UTILIZE ARRAY NA ESTRUTURA DE STORAGE DO SERVIDOR

Bancos de dados, conceitualmente, utilizam intenso acesso à discos. Por esta razão e não só para o armazenamento de grandes massas de dados, os principais fabricantes de hardware disponibilizam unidades de "storage" de alto desempenho para serem integradas à servidores de dados.
Estas unidades SCSI utilizam um conceito extremamente moderno de "arrays" de disco, que são na verdade "condomínios" estruturados para conjugar diversos discos com o objetivo de ganhar segurança no armazenamento e performance no acesso para leitura e gravação.
Quanto maior a quantidade de discos, independentemente do seu tamanho, maior a possibilidade de performance. As controladoras de "array" permitem, inclusive, que se possa balancear segurança e performance, que são inversamente proporcionais.
Isso, por si só, não quer dizer que uma estrutura de "storage" super-dimensionada elimine a necessidade de um processador adequado ou de uma quantidade de memória física condizente com a utilização do equipamento. Pelo contrário, a questão "storage" precisa estar resolvida para que se possa planejar o processador e a quantidade de memória física necessários.
É comum em servidores com problemas de contenção de discos (fila de trabalho causada pela sobrecarga na utilização do "storage"), que o processador e a memória física sejam sub-utilizados, porque como a atividade está aguardando liberação do "storage", o processador e a memória acabam sendo requisitados pela velocidade em que a fila vai sendo liberada, muito abaixo do necessário.
É algo como olharmos o trânsito na saída do pedágio da Imigrantes num feriado de carnaval por exemplo. Antes do pedágio, dezenas de quilômetros de congestionamento. Após o pedágio,se existirem 10 postos de arrecadação, saem 10 veículos por vez... Se existirem 20 postos, saem 20 veículos por vez...
Quanto menos postos de arrecadação, mais a fila cresce potencialmente. O numero de postos de arrecadação corresponderia, numa analogia, ao número de discos do array.
Quanto mais lenta a liberação da fila, menos a estrada depois do pedágio (processador e memória física) é requisitada, a despeito dos quilômetros de congestionamento antes do pedágio...
Nestes casos, assim que se resolve o problema do "storage", ficam evidentes eventuais problemas de processador e de memória.

PADRONIZE AS DECLARACÕES SQL AO MÁXIMO

O Oracle trabalha todas as requisições de usuário na SGA (System Global Área), que é um pedaço da memória do servidor reservado para uso exclusivo do banco de dados.
Dentro da SGA, entre outras, o Oracle mantém uma área para compartilhamento de SQL, também chamado "pool compartilhado". Todas as declarações SQL são executadas dentro desse "pool".
Quando recebe uma declaração SQL, antes de carregá-la no "pool" o banco verifica se ela já existe. Se existir, a declaração já existente é executada. Isso aumenta a performance na resposta da declaração SQL. Desta forma, fazer várias declarações SQL idênticas, mas escritas de forma diferente, impede o banco de procurar respostas mais rápidas. Por exemplo:
SELECT * FROM CLIENTES WHERE CODIGO = 10;
Não é igual a
Select * from clientes where código = 10;
Se ambas as declarações forem escritas de forma idêntica, o tempo de resposta da segunda será menor. Agora imagine quantas vezes isso acontece dentro da sua aplicação. Percebeu quanto tempo pode ser economizado?

CRIE TABELAS DE ELEVADO CRESCIMENTO EM DATAFILES SEPARADOS

As tabelas da sua aplicação que potencialmente forem crescer muito rápido, isto é, tiverem uma elevada taxa de crescimento, você deve criar em DATAFILES separados, ou até mesmo em TABLESPACES separadas se preferir.
Isso irá diminuir consideravelmente a fragmentação das informações, e conseqüentemente melhorar a performance.

UTILIZE CORRETAMENTE ÍNDICES

A adequada utilização de índices contribui consideravelmente para melhorar o tempo de resposta das consultas SQL. Ao criar um índice, você dá ao banco a oportunidade de não ter que procurar informações na tabela inteira (operação chamada de "full scan") e de encontrá-las mais rapidamente através das estruturas dos índices.
Assim você deve criar índices:
- para indexar as colunas utilizadas nas cláusulas WHERE ou AND de uma declaração SQL;
- para indexar colunas que se referenciam a chaves-primárias de outras tabelas, ou seja, utilizadas em constraints foreign key;
Aqui uma consideração importante que você provavelmente vai ter dificuldade de encontrar em literaturas, mas que vivemos muito na "vida real".
O Oracle tem muita dificuldade em resolver através de índices a condição <> (diferente de). Assim, evite ao máximo usar esta condição em SELECTS que envolvam tabelas potencialmente grandes.

Nenhum comentário:

Postar um comentário