Uma Abordagem Prática Sobre Otimização de Banco de Dados Alterando a Área de Memória no Sistema Gerenciador de Banco de Dados Oracle Hugo F. Carrara1, Lucas V. Souza1, Miguel J. das Neves2 Graduando em Tecnologia em Banco de Dados – Faculdade de Tecnologia de Bauru (FATEC) Bauru – SP – Brasil 2 Professor do Curso de Tecnologia em Banco de Dados – Faculdade de Tecnologia de Bauru (FATEC) Bauru – SP – Brasil 1 [email protected], [email protected], [email protected] Abstract. Because of the big amount of data generated by the companies that use information systems, database is essential. Data usually need to be accessed constantly, so the results availability are even not satisfactory. This context brings us the question of performance related to find information. Performance problems are not related to infrastructure, operating systems or hardware. Adjusting and optimizing the memory structure becomes an important factor and can obtain a considerable gain of performance. This article rates how to improve the performance of a database management system, suggesting possible changes that can improve databases performance changing values of memory areas. Resumo. Devido ao grande volume de dados que são gerados pelas Empresas que utilizam Sistemas de Informação, é fundamental o papel do Banco de Dados. Geralmente os dados precisam ser acessados a todo instante, logo, a disponibilidade dos resultados nem sempre são satisfatórias. Nesse contexto, entra a questão do desempenho ao se buscar informações. Muitos problemas de desempenho não estão relacionados à infraestrutura, sistemas operacionais ou mesmo ao hardware. Ajustar e otimizar a estrutura de memória torna-se fator importante, podendo-se ter um ganho de performance considerável. Este artigo avalia como melhorar o desempenho do Sistema Gerenciador de Banco de Dados, sugerindo possíveis alterações que possam levar a um ganho de desempenho modificando os valores das áreas de memória. 1. Introdução Cada vez mais empresas buscam em sistemas informatizados uma ferramenta que forneça apoio na melhoria dos processos e suporte a tomada de decisões. O conceito de tuning parte do princípio de sintonizar ou ajustar algo para que funcione melhor, partindo desse conceito, tuning é a otimização das configurações dos componentes que fazem parte de todo o sistema envolvido no armazenamento e gerenciamento dos dados, seja esse ajuste na parte de hardware ou software. Quando se fala em tuning, refere-se genericamente em ganho de performance, porém, não necessariamente essa performance corresponde a tempo de resposta, neste caso, pode-se considerar alguns outros aspectos tais como um consumo menor de memória no servidor, a utilização mais otimizada do disco ou até mesmo suportar uma quantidade maior de usuários. Considerando o processo de aumento de desempenho como um todo, são vários os profissionais envolvidos, colaborando cada qual em sua área para a sintonia do projeto, pode-se dizer então que o processo de tuning envolve várias competências e tecnologias que partirá desde o design da aplicação, passará pela análise e desenvolvimento quanto a programação, a análise e estruturação da base de dados e por fim, seguirá a parte de infra estrutura. Dentro desse contexto, estão os Sistemas de Gerenciamento de Banco de Dados (SGBD’s) armazenando e gerenciando informações, disponibilizando-as de forma rápida e eficaz, contudo, SGBD´s não são ferramentas auto suficientes, se considerado as consultas que serão realizadas dentro do banco de dados, necessitando ser configurado e ajustados de forma particular para cada tipo de dado a ser armazenado. Exposto esse motivo, despende-se esforços no sentido de aperfeiçoar seu funcionamento interno, melhorando a organização das informações e como serão obtidas. Algumas questões devem ser consideradas no processo de otimização envolvendo o Banco de Dados, levado em conta que o processo de tuning exige a definição detalhada de passos a serem seguidos, bem como elaborada toda uma documentação de quais serão os procedimentos aplicados. No âmbito do banco de dados, o profissional responsável pelo tuning é o Administrador de Banco de Dados (Databases Administrator ou DBA), é ele quem irá determinar os objetivos a serem alcançados, baseando-se em algumas questões que serão objeto desta pesquisa, por exemplo, o porquê realizar o processo de otimização? O quanto de tuning deve ser feito? Essas questões podem ser respondidas com a interpretação de relatórios gerados a partir de ferramentas existentes no próprio SGDB. Conforme Gehrke e Ramakrishnan (2008), para obter o melhor resultado possível em se tratando de desempenho, é necessário a sintonização continuada do banco de dados. Após a fase final do projeto de banco de dados, seu uso real fornece informações detalhadas que podem ser utilizadas a fim de melhorar o desempenho em relação ao desempenho. Este trabalho tem por objetivo apresentar os benefícios alcançados com a otimização de desempenho em banco de dados e as vantagens que ela pode trazer para as empresas e profissionais de tecnologia da informação nos seus negócios. 2. Gerenciadores de Banco de Dados Segundo Andrade (2005), possuir um ambiente dinâmico é principal problema relacionado aos bancos de dados. Pode-se considerar também o crescimento constante da população de dados resultando em mudanças de suas configurações. Algumas ferramentas são importantes para a coleta de estatísticas para análise do desempenho do banco de dados com o objetivo definir novas configurações dependendo do resultado obtido em seus relatórios. A coleta de estatísticas no Oracle, é um dos recursos mais importantes para quem está monitorando, otimizando o desempenho e resolvendo problemas. Segundo Date (2004), visto que o usuário não determina como e sim o que ele pretende receber, ou seja, não especificam um procedimento, o processo em torno dos dados armazenados para atender a requisição do usuário é feito automaticamente. A otimização pode ser dividida em três seguimentos principais que segundo Tramontina (2008) são: (1) refinamento do esquema das relações e consultas feitas na base de dados, (2) configuração do sistema operacional em uso e (3) configuração dos parâmetros do SGBD, esse último segmento relacionado ao estudo deste trabalho. 3. Estrutura de Memória Oracle A arquitetura Oracle está dividida em duas estruturas de memórias, uma delas é a Program Global Area que é privada e alocada para um único processo e dependente da configuração da conexão do banco de dados ou servidor compartilhado/dedicado (Bryla e Loney, 2008). A outra estrutura é chamada de System Global Area (SGA) é um grupo de estruturas de memória compartilhadas, utilizadas para armazenar e acessar informações do banco de dados que são divididas pelos processos e usuários da instância do banco, contendo dados e informações para o controle da instancia do Oracle. Em casos em que diversos usuários estão conectados simultaneamente à mesma instância, os dados na SGA da instância são compartilhados entre os usuários (Bryla e Loney, 2008). Dentro da SGA está a shared pool e dentro dela, outras duas divisões de memória (library cache e data dictionary cache) compartilhada pelos usuários da instância de banco de dados que fazem parte da arquitetura como um todo. No processo de inicialização de uma instância Oracle, a memória é dimensionada para a SGA com base nos valores definidos no arquivo de parâmetros de inicialização ou codificados no software Oracle. Quando uma instância é inicializada, a memória é alocada pelo Oracle, e ao ser finalizada, esta memória é liberada [Bryla e Loney 2008]. 3.1 Conceitos em Shared Pool Segundo Mauro Pichiliani (2013), shared pool é uma área de memória constituída por dois subcaches principais: o cache de biblioteca (library cache), utilizado para armazenar os comandos Structured Query Language (SQL) e Procedural Language / Structured Query Language (PL/SQL) executados recentemente no banco de dados; e o cache de dicionário de dados (data dictionary cache), que armazena um subconjunto de colunas das tabelas do dicionário de dados após serem lidos no buffer cache. Estes comandos SQL podem ser solicitados por processos do usuário ou, no caso de stored procedures, lidos do dicionário de dados. O shared pool é dimensionado pelo parâmetro de inicialização SHARED_POOL_SIZE. Para visualizar o tamanho atual é utilizado o comando SHOW PARAMETER SHARED_POOL_SIZE. Relacionado a desempenho, um dos principais componentes do SGA é o library cache que é o responsável pelo gerenciamento do acesso ao cache de instruções SQL, procedures, funcitions, packs entre outros. [Bryla e Loney 2008]. Esse componente é o responsável por armazenar em sua memória as últimas instruções SQL que foram utilizadas, e conforme vão deixando de ser utilizadas, fazendo a renovação por outras instruções mais recentes, ou seja, quando uma nova instrução é executada, esse componente elimina a primeira instrução que foi utilizada com o objetivo de liberar o espaço de memória para a alocação de uma instrução mais recente. Quando uma instrução SQL é executada e está na área de memória do library cache, pode-se dizer que tal instrução recebe o valor de hit, e quando não se encontra na área de memória, recebe o valor de miss, que é exatamente o que deve ser evitado, para verificação do percentual de hit é necessário observar a coluna GETHITRATIO da view V$LIBRARYCACHE [Pichiliani 2013]. O objetivo da otimização do componente library cache é aumentar a quantidade de instruções que serão encontradas (hit) na área de memória e diminuir ou eliminar os casos em que não serão encontradas (miss). Existem algumas recomendações em relação a melhoria de performance do espaço de memória do library como a utilização de um código genérico, com a utilização de variáveis que poderão ser reutilizados mudando-se somente alguns parâmetros. Outra recomendação importante é fazer uso de módulos, ou seja, procedures e functions. A utilização de stored procedures (procedimentos armazenados) melhora o desempenho de consultas em um ambiente de rede, visto que os mesmos já estão précompilados e contém um plano de execução guardado na memória [Gunderloy e Jorden 2001]. A análise de alguns parâmetros é determinante para na oimização do library cache, um dos principais fatores de análise é o tamanho reservado para o shared pool, que por padrão é oito megabytes. Existe também uma parte da memória que pode ser reservada para o shared pool para armazenar instruções e grandes compilações, a recomendação é que se destine dez por cento do tamanho total do shared pool. 4. Metodologia Foi utilizado para realização deste trabalho o SGBD, Oracle 11g Release 2 na sua versão Standard Edition para sistemas trinta e dois bits, que pertence a Oracle Corporation sendo executado sobre a plataforma de Sistema Operacional Windows Server 2008 sistemas trinta e dois bits. Paralelamente ao SGBD foram utilizados os programas SQL Plus, Oracle SQL Developer, Apex, bem como ferramentas de geração de relatórios e views provenientes do próprio SGBD Oracle. Para a realização dos testes foi utilizado o aplicativo Benchmark Factory na versão freeware pertencente a Quest Software capaz de simular acesso simultâneo bem como uma grande quantidade de consultas permitindo a avaliação do comportamento da performance do SGBD diante dessas cargas. 4.1. Resultados Obtidos Para este trabalho foram elaborados testes simulando ambientes de trabalho com manipulação e acessos simultâneos de vinte usuários com as configurações padrão dos parâmetros de inicialização e após mensuração e análise, a realização novos testes com alteração nos valores de memória dos parâmetros. Como citado anteriormente, o parâmetro de inicialização SHARED_POOL_SIZE vem configurado com oito megabytes, os testes iniciais mostram o resultados com o valor padrão e a seguir com o valor de oitenta megabytes, valor escolhido de forma empírica. 4.2. Testes com valor padrão do parâmetro SHARED_POOL_SIZE A tabela e no gráfico a seguir os resultados dos testes com o valor padrão do parâmetro de inicialização. Tabela 1. Resultados dos testes com valor padrão SHARED_POOL SIZE (Fonte: simulação no software Benchmark Factory freeware). Descrição Resultados Transações por segundo 1.091 Tempo médio de resposta (em segundos) 0.036 Tempo médio das transações (em segundos) 0.040 Número de execuções 202 Número de linhas 247 Erros 0 do de Nota-se na tabela 1 que ao passar uma carga máxima de vinte usuários ao software de Benchmark e com o parâmetro de inicialização da área de memória shared pool em seu valor padrão, obtivemos 1.091 transações por segundo em um tempo médio de resposta de 0,036 segundos e numa média de 0,040 de segundos no total das transações, executando 202 operações, em 247 linhas e tudo a 0 erros. Imagem 1. Média do tempo de resposta em milissegundos (Fonte: simulação no software de Benchmark Factory freeware). Notamos que na imagem 1, representação do ambiente descrito na tabela 1, o tempo de resposta se inicia acima de 400 milissegundos, e ao passo que as instruções estão sendo gravadas na área de memória denominada shared pool esse tempo diminui. Nesta simulação a porcentagem de hit cache foi de 44,56 %, esta informação representa que menos que a metade das instruções SQL solicitadas foram encontradas em memória cache. 4.3. Testes com valor alterado do parâmetro SHARED_POOL_SIZE A tabela e no gráfico a seguir os resultados dos testes com o valor de 80 megabytes para parâmetro de inicialização. Tabela 2. Resultados dos testes com valor SHARED_POOL SIZE (Fonte: simulação no Benchmark Factory freeware). alterado software Descrição Resultados Transações por segundo 1.093 Tempo médio de resposta (em segundos) 0.008 Tempo médio das transações (em segundos) 0.012 Número de execuções 202 Número de linhas 247 Erros 0 do de Nota-se na tabela 2 que ao passar uma carga máxima de vinte usuários ao software de Benchmark e com o parâmetro de inicialização da área de memória shared pool em seu valor 80 megabytes, obtivemos 1.093 transações por segundo em um tempo médio de resposta de 0,008 segundos e numa média de 0,012 de segundos no total das transações, executando 202 operações, em 247 linhas e tudo a 0 erros. Imagem 2. Média do tempo de resposta em milissegundos (Fonte: simulação no software de Benchmark Factory freeware). Nota-se na imagem 2, representação do ambiente descrito na tabela 2, o tempo de resposta se inicia com abaixo dos 120 milissegundos e ao passo que as instruções estão sendo gravadas na área de memória denominada shared pool esse tempo diminui. Nesta simulação a porcentagem de hit cache atingiu de 61,75 %, ou seja, como a memória destinada a shared pool está maior, as instruções SQL permanecem por mais tempo e são encontradas em memória cache, evitando o acesso e leitura de disco físico e consequentemente uma diminuição no tempo médio de resposta. 4.4. Comparação dos ambientes A tabela a seguir mostra o comparativo dos resultados dos testes 1 e 2. Tabela 3. Comparação dos resultados dos testes 1 e 2 (Fonte: simulação no software de Benchmark Factory freeware). Descrição Teste 1 Teste 2 Transações por segundo 1.091 1.093 Tempo médio de resposta (em segundos) 0.036 0.008 Tempo médio das transações (em segundos) 0.040 0.012 Número de execuções 202 202 Número de linhas 247 247 Erros 0 0 No comparativo dos resultados se observa que o redimensionamento da área de memória shared pool resultou em um melhor desempenho. Também foi possível observar uma diminuição considerável no tempo médio de resposta. 5. Conclusão A realização deste estudo demonstrou a necessidade de mensuração, análise e acompanhamento do desempenho do banco de dados, fatos esses possíveis através de ferramentas disponibilizadas pelo próprio SGBD onde interpretação correta dessas informações pode resultar em um ganho significativo de desempenho através de um ajuste em um parâmetro de inicialização. Em grandes ambientes empresarias em que a informação se torna cada vez mais fator essencial para o gerenciamento, segundos podem fazer a diferença no suporte à tomada de decisões na área de negócios. 6. Referências Andrade, L. D. (2005) “Otimização de Consultas de Aplicações T-SQL em Ambiente SQL Server 2000”. Salvador, Bahia. Bryla, B. e Loney, K. (2008) “Oracle Database 11g DBA Handbook”. Oracle Press. Date, C. J. (2004), “Introdução a Sistemas de Banco de Dados, Campus”, 8ª edição. Gehrke, J.; Ramakrishna, R. (2008) “Sistemas de Gerenciamento de Banco de Dados”. São Paulo, São Paulo. Gunderloy, M.; Jorden, J. L. (2001) “Dominando o SQL Server 2000”. São Paulo, São Paulo. Pichiliani, M. “Curso Oracle: Otimização de Desempenho” Disponível em: http://www.devmedia.com.br/curso/curso-de-oracle-otimizacao-de-desempenho/390. Último acesso em: 20 abr. 2014. Tramontina, G. B. Database Tuning: “Configurando o Interbase e o PostgreSQL” Disponível em: http://www.ic.unicamp.br/~geovane/mo410-091/Ch20ConfigInterbasePosgres-art.pdf . Último acesso em 29 mar. 2014.