UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO DESENVOLVIMENTO DE UMA FERRMANENTA PARA ANÁLISE DE AJUSTE DE DESEMPENHO DO BANCO DE DADOS ORACLE Área de Banco de Dados por Jonas Rosa Adriana Gomes Alves, M.Eng. Orientadora Itajaí (SC), junho de 2005 UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO DESENVOLVIMENTO DE UMA FERRMANENTA PARA ANÁLISE DE AJUSTE DE DESEMPENHO DO BANCO DE DADOS ORACLE Área de Banco de Dados por Jonas Rosa Relatório apresentado à Banca Examinadora do Trabalho de Conclusão do Curso de Ciência da Computação para análise e aprovação. Orientador: Adriana Gomes Alves, M.Eng. Itajaí (SC), junho de 2005 i SUMÁRIO LISTA DE ABREVIATURAS..................................................................v LISTA DE FIGURAS ..............................................................................vi LISTA DE TABELAS.............................................................................vii RESUMO ................................................................................................viii ABSTRACT ..............................................................................................ix 1. INTRODUÇÃO.....................................................................................1 1.1. OBJETIVOS ........................................................................................................ 3 1.1.1. Objetivo Geral ................................................................................................... 3 1.1.2. Objetivos Específicos ........................................................................................ 3 1.2. METODOLOGIA................................................................................................ 4 1.3. ESTRUTURA DO TRABALHO ....................................................................... 5 2. FUNDAMENTAÇÃO TEÓRICA .......................................................7 2.1. BANCO DE DADOS ORACLE ......................................................................... 7 2.1.1. A Historia do Banco de Dados Oracle ............................................................ 7 2.2. SISTEMA DE GERENCIADOR DE BANCO DE DADOS ORACLE ......... 9 2.2.1. Estrutura Física................................................................................................. 9 2.2.2. Estrutura da Memória.................................................................................... 11 2.2.3. Estrutura Lógica ............................................................................................. 14 2.2.4. Seqüência de UNDO ....................................................................................... 16 2.3. CONCEITO DE AJUSTE DE DESEMPENHO ............................................ 17 2.3.1. Localização de Gargalos................................................................................. 18 2.3.2. Parâmetros Ajustáveis.................................................................................... 19 2.3.3. Ajuste de Esquemas ........................................................................................ 21 2.3.4. Ajuste de Índices ............................................................................................. 22 2.3.5. Ajuste de Transações ...................................................................................... 23 2.3.6. Simulação de Desempenho ............................................................................. 24 2.4. AJUSTE DE DESEMPENHO.......................................................................... 25 2.4.1. Administração Básica de Banco de Dados.................................................... 25 2.4.2. Performance Tuning ....................................................................................... 26 2.5. FERRAMENTAS DE TUNING PARA ORACLE ........................................ 31 2.5.1. Oracle Enterprise Manager (OEM) .............................................................. 31 2.5.2. Oracle SQL Scratchpad ................................................................................. 34 2.5.3. TOAD ............................................................................................................... 35 2.6. ESTUDO SOBRE SISTEMAS E PROJETOS SIMILARES ....................... 36 2.6.1. GURU - Uma ferramenta Para Administrar Banco de Dados Através da Web 37 2.6.2. Análise de Desempenho do Banco de Dados Oracle 9i................................ 41 2.7. CONCLUSÕES DA FUNDAMENTAÇÃO TEÓRICA ................................ 42 3. PROJETO............................................................................................44 3.1. REQUISITOS .................................................................................................... 44 3.2. DIAGRAMA DE CONTEXTO........................................................................ 44 3.3. DIAGRAMAS DE FLUXO DE DADOS......................................................... 46 3.3.1. Solicita Acesso ao Banco de Dados................................................................ 46 3.3.2. Solicita Instalação da Ferramenta................................................................. 48 3.3.3. Solicita Visualização da Estrutura Lógica da Memória ............................. 50 3.3.4. Solicita Visualização do Shared Pool ............................................................ 52 3.3.5. Solicita Análise do Plano de Execução.......................................................... 54 3.3.6. Solicita Reconstrução de Índices do Banco de Dados.................................. 56 3.3.7. Solicita Ajuste de Esquemas .......................................................................... 58 3.3.8. Solicita Consulta de Acessos ao Banco de Dados......................................... 68 3.3.9. Solicita Consulta de Análise de Índices......................................................... 70 3.4. MODELAGEM ENTIDADE RELACIONAMENTO................................... 71 3.5. FERRAMENTAS UTILIZADAS .................................................................... 72 4. VALIDAÇÃO......................................................................................73 4.1. ESTRUTURA LÓGICA DA MEMÓRIA....................................................... 73 4.1.1. Shared Pool...................................................................................................... 73 4.1.2. Database Buffer Cache ................................................................................... 74 4.1.3. Redo Log Buffer .............................................................................................. 74 4.1.4. Java Pool .......................................................................................................... 74 4.1.5. Large Pool........................................................................................................ 75 4.2. VISUALIZAÇÃO DA SHARED POOL ......................................................... 75 4.2.1. Shared Pool...................................................................................................... 75 4.2.2. Dictionary Cache............................................................................................. 75 4.2.3. Library Cache ................................................................................................. 76 4.3. RECONSTRUÇÃO DE ÍNDICES................................................................... 76 4.4. PLANO DE EXECUÇÃO................................................................................. 76 4.5. AJUSTE DE ESQUEMAS................................................................................ 77 4.5.1. Visualização de Tabelas.................................................................................. 77 4.5.2. Criação de Tabelas.......................................................................................... 78 4.5.3. Visualização de Índices................................................................................... 78 4.5.4. Criação de Índices........................................................................................... 78 4.6. COMPARATIVO ENTRE PROJETOS ESTUDADOS E PROJETO IMPLEMENTADO ................................................................................................... 78 5. CONCLUSÕES ...................................................................................80 REFERÊNCIAS BIBLIOGRÁFICAS ..................................................83 APÊNDICE A – MODELAGEM DE DADOS .....................................85 APÊNDICE B – ESPECIFICAÇÃO DAS FUNÇÕES.........................87 iii APÊNDICE C – INSTALAÇÃO DA FERRAMENTA ..................... 110 ANEXO I – RESUMO PUBLICADO NO CRICTE 2004 ................. 112 ANEXO II – ARTIGO .......................................................................... 113 iv LISTA DE ABREVIATURAS CBO CKPT CPU DBA DBWR DDL DML DSS I/O LGWR LRU OLTP PC PGA PMON RAM RBO SGA SGBD SMON TCC UNIVALI Cost Based Optimizer Recover Central Processing Unit Database Administrator Database Write Data Definition Language Data Manipulation Language Decision Support System Input/Output Log Write Least Recently Used On-line Transaction Processing Personal Computer Process Global Area Process Monitor Random Access Memory Rule Based Optimizer System Global Area Sistema de Gerenciamento de Banco de Dados System Monitor Trabalho de Conclusão de Curso Universidade do Vale do Itajaí LISTA DE FIGURAS Figura 1: Estrutura Física Fonte: Adaptado de Fanderuff (2003) ......................................................11 Figura 2. Estrutura de memória utilizada pelo banco de dados Oracle Fonte: Adaptado de Zegger (2001) .........................................................................................................................................12 Figura 3. Inicialização de uma instância no Oracle Fonte: Adaptado de Ramalho (1999)................14 Figura 4. Estrutura Lógica Fonte: Adaptado de Fanderuff (2003).....................................................15 Figura 5. Estrutura de um bloco de dados Fonte: Adaptado de Ramalho (1999) ..............................16 Figura 6. Análise de Explain Plan .....................................................................................................31 Figura 7. Ferramenta Oracle Enterprise Manager..............................................................................32 Figura 8. Funcionalidades da Pasta Instância.....................................................................................33 Figura 9. Funcionalidades da Pasta de Armazenamento....................................................................34 Figura 10. Ferramenta SQL Scratchpad.............................................................................................35 Figura 11. Ferramenta TOAD ............................................................................................................36 Figura 12. Diagrama de Contexto ......................................................................................................45 Figura 13. Solicita Acesso ao Banco de Dados..................................................................................46 Figura 14. Tela do Controle de Acesso ao Banco de Dados. .............................................................48 Figura 15. Solicita Instalação da Ferramenta .....................................................................................49 Figura 16. Tela de Configuração da Ferramenta................................................................................50 Figura 17. Solicita Visualização da Estrutura Lógica da Memória....................................................51 Figura 18. Tela de Visualização da Estrutura Lógica da Memória ....................................................52 Figura 19. Solicita Visualização da Shared Pool...............................................................................53 Figura 20. Tela de Visualização da Shared Pool ...............................................................................54 Figura 21. Solicita Análise do Plano de Execução.............................................................................55 Figura 22. Tela de Análise do Plano de Execução.............................................................................56 Figura 23. Solicita Reconstrução de Índices do Banco de Dados......................................................57 Figura 24. Tela de Reconstrução de Índices ......................................................................................58 Figura 25. Solicita Ajuste de Esquemas.............................................................................................59 Figura 26. Tela de Ajustes de Esquemas............................................................................................60 Figura 27. Visualização de Tabelas....................................................................................................60 Figura 28. Tela de Visualização de Tabelas.......................................................................................61 Figura 29. Criação de Tabelas............................................................................................................62 Figura 30. Tela de Criação de Tabelas...............................................................................................63 Figura 31. Visualização de Índices. ...................................................................................................64 Figura 32. Tela de Visualização de Tabelas.......................................................................................65 Figura 33. Criação de Índices.............................................................................................................66 Figura 34. Tela de Criação de Tabelas...............................................................................................67 Figura 35. Consulta de Acessos ao Banco de Dados. ........................................................................68 Figura 36. Tela de Consulta de Acessos ............................................................................................69 Figura 37. Consulta de Análise de Índices.........................................................................................70 Figura 38. Tela de Consulta de Índices Reconstruídos ......................................................................71 Figura 39. Diagrama de Entidade/Relacionamento............................................................................72 LISTA DE TABELAS Tabela 1. Parâmetros envolvidos no desempenho do banco de dados...............................................19 Tabela 2. Quadro de vantagens e desvantagens .................................................................................40 Tabela 3. Quadro de vantagens e desvantagens .................................................................................42 Tabela 4. Descrição das tabelas utilizadas no sistema .......................................................................71 Tabela 5. Tabela de vantagens e desvantagens entre ferramentas .....................................................78 Tabela 6. Dicionário de dados da tabela acoes...................................................................................85 Tabela 7. Dicionário de dados da tabela esquemas............................................................................85 Tabela 8. Dicionário de dados da tabela indices ................................................................................85 Tabela 9. Dicionário de dados da tabela instancias............................................................................85 Tabela 10. Dicionário de dados da tabela memoria_logicas..............................................................86 Tabela 11. Dicionário de dados da tabela plano_execucoes ..............................................................86 Tabela 12. Dicionário de dados da tabela shared_pools ....................................................................86 RESUMO ROSA, Jonas. Desenvolvimento de uma Ferramenta para Análise de Ajuste de Desempenho do Banco de Dados Oracle. Itajaí, 2005. 88 f. Trabalho de Conclusão de Curso (Graduação em Ciência da Computação) - Centro de Ciências Tecnológicas da Terra e do Mar, Universidade do Vale do Itajaí, Itajaí, 2005. A finalidade de um banco de dados é auxiliar na organização e na recuperação de dados. Em um banco de dados, há dois tipos distintos de acessos, um quando não há um SGBD (Sistema de Gerenciamento de Banco de Dados) e, no outro caso, quando o acesso a um banco de dados é realizado através de um SGBD. É justamente nessa segunda situação que o gerenciador assume a responsabilidade de buscar todas as informações necessárias controlando, assim, os dados e tendo o DBA (Database Administrator) como responsável por esse controle. Um DBA, por sua vez, tem diversas funções e, entre essas está a de ajustar o sistema para obter o melhor desempenho do banco de dados. O ajuste de desempenho (performance tuning) de um banco de dados pode ser feito de duas formas: através da elaboração de projetos que visam melhorar o desempenho de uma aplicação especifica; e/ ou através de ajustes de vários parâmetros. Ao se aprofundar nessas formas de ajuste de desempenho, fica evidente a necessidade de utilizar ferramentas para ajuste de desempenho que viabilizem e auxiliem esse processo de ajuste de desempenho. Sendo assim, este trabalho visa desenvolver uma ferramenta que auxilie no ajuste de desempenho do banco de dados Oracle. Entre as suas funcionalidades, estão: mostrar dados estatísticos através de gráficos; apresentar formas de melhorar a performance de um banco de dados; gerar scripts para realização da manutenção de um banco de dados e, por fim, manter um histórico das ações desta ferramenta. Palavras-chave: Ajuste de Desempenho. Sistema Gerenciador de Banco de Dados. Oracle. ABSTRACT The aim of a database is to aid in the organization and the recovery of data. And, in a database, there are two distinct Kinds of accesses, one when there is not a database management system (DMS), and, in other case, when the access is accomplished through the DMS. It is just in the second situation that the administrator takes over the responsibility of searching all the necessary information controlling, then, the data and being the database administrator (DBA) as responsible by this control. However, a DBA has several functions and among these there is the function of adjusting the system to get the best performance of database .The adjust of performance (performance tuning) of a database can be done of two forms: throught the elaboration of projects that aim to improve the performance of a scientific application, and/ or thought regulations of several parameters. When it is made a profound study of these regulation forms of performance, it is evident the necessity of using tools (optimizers) that turn possible and aid this process of performance regulation of Oracle database. Among its functions are: to show statistics data throught the graphics, to present forms of improving the performance of a database, to generate scripts to the accomplishment of database maintenance and lastly to keep description of the actions of this tool. Keywords: Performance Tuning, Database Management System and Oracle. 1. INTRODUÇÃO Um banco de dados tem a finalidade de auxiliar na organização e na recuperação de dados. Não necessariamente um sistema de processamento de dados utiliza um SGBD (Sistema de Gerenciamento de Banco de Dados) para recuperação de informações, sendo que nesse caso, cabe ao desenvolvedor criar formas dessa recuperação. Porém, quando o acesso a um banco de dados é realizado através de um SGBD, cabe ao gerenciador assumir a responsabilidade de buscar todas as informações especificadas. (FANDERUFF, 2003). Sendo assim, a principal função de um SGBD é ter o controle centralizado dos dados, tendo o DBA (Database Administrator), como responsável por esse controle. Entre as funções de um DBA, de acordo com Fanderuff (2003), estão: definir quais dados serão armazenados e quais os acessos mais freqüentes; disponibilizar os dados desejados pelo usuário; fazer regras de acessos e os backups e como realizar a recuperação de informação quando da perda ou danificação dos dados; e ajustar o sistema para obter o melhor desempenho do banco de dados. É justamente essa última função, que consiste no ajuste do sistema para melhorar o desempenho do banco de dados, o foco desse trabalho. Fanderuff (2003) relata que quando o desempenho de um banco de dados não é o esperado, então há dois motivos que resultam nesse problema de desempenho: utilização de recursos inadequados; e realização de um projeto inadequado. De acordo com Silberschatz & Korth (1999), o ajuste de desempenho (performance tuning) de um banco de dados pode ser feito das seguintes formas: através de ajustes de vários parâmetros; e/ou através da elaboração de projetos que visam melhorar o desempenho de uma aplicação especifica. O mesmo autor destaca seis passos para que seja realizado o ajuste de desempenho de um banco de dados: (i) localização de gargalos; (ii) ajuste do banco de dados; (iii) ajuste de esquemas; (iv) ajuste de índices; (v) ajuste de transações; e (vi) simulação de desempenho. Quanto ao primeiro passo, localização de gargalos, Silberschatz & Korth (1999) cita que um programa pode estar gastando muito do seu tempo de execução em pequenos laços, enquanto que o restante do código consome muito pouco. São justamente esses pequenos laços que compõem o gargalo. Se um gargalo consome 80% do tempo total do sistema, mesmo que seja apenas um pequeno laço, melhorá-lo irá aumentar muita a performance do programa. Resumindo, o primeiro passo é detectar gargalos e procurar melhorar o seu desempenho. Quando um gargalo é então neutralizado, um novo gargalo pode ser encontrado e melhorado. O segundo passo consiste em ajudar o banco de dados, o que pode ser feito em três níveis: O nível mais baixo é o de hardware, onde com uma simples inclusão de memória no buffer do banco de dados pode representar melhoras no SGBD.O segundo nível é uma relação aos parâmetros do sistema do banco de dados, como o tamanho do buffer, porém, alguns bancos já ajustam esse buffer automaticamente. Por último, então, é o de mais alto nível, o qual diz respeito a índices, esquemas e transações. A combinação desses três níveis é de grande importância. O ajuste de esquema é o terceiro passo para o ajuste de desempenho de um banco de dado. Esses esquemas são restrições impostas pela normalização adotada, sendo que o seu ajuste irá resultar em uma melhor distribuição dos registros, utilizando menos espaços no buffer do banco de dados. Como quarto passo, tem-se o ajuste de índices. Esse ajuste é realizado quando o índice é o gargalo, podendo ser acelerado com a criação de novos índices ou da sua exclusão, quando se faz necessário. Há casos em que o tipo de índice pode ser alterado de arvore-B para hash, ou vice-versa. O quinto passo diz respeito ao ajuste de transações. Muitos SGBDs já possuem embutidos um otimizador de transações que, de acordo com Silberschatz & Korth(1999), até mesmo consultas mal escritas podem ser realizadas com eficiência. Por fim, o sexto e ultimo passo diz respeito á simulação de desempenho, a qual se refere a criação de um modelo de simulação, para que seja mostrada uma diversidade de serviços, como CPU (Central Processing Unit), discos, buffer e controles de concorrência. Nessa simulação, diferentes experimentos podem ser feitos, de forma que o ajuste de desempenho seja realizado antes da sua real implantação. Vendo esses aspectos e esses passos importantes para o gerenciamento de um SGBD, fica evidente a necessidade de utilizar ferramentas para ajustes de desempenho que viabilizem e auxiliem este processo de ajuste de desempenho. 2 Porém, uma ferramenta para ajuste de desempenho tem que usar diversos recursos. Date (2000) relata que uma boa ferramenta deve ter uma grande quantidade de informações disponíveis de forma estatística, como, por exemplo, o numero de valores em cada domínio e o número atual de tuplas em cada variável de relação básica. Uma tupla é um registro inserido em uma tabela de banco de dados. Date (2000) ainda cita que essas informações ficam guardadas no catalogo do sistema, permitindo a ferramenta fazer uso e avaliar essas informações, de forma que possa projetar estratégias de ação e escolher a implementação mais eficiente. Em suma, uma ferramenta para ajuste de desempenho tem que ter recursos que possibilite avaliar uma centena de possíveis estratégias para execução de uma requisição. Além disso. Conforme são alteradas as estatísticas armazenadas, a mesma estratégia já não satisfaz a mesma realização da requisição. Este trabalho se insere no contexto acima apresentado e visa o desenvolvimento de uma ferramenta que auxilie no ajuste de desempenho do banco de dados Oracle. Para isso, será feito um estudo sobre SGBDs buscando: (i) definir o que é um tuning de banco de dados; (ii) mostrar dados estatísticos; (iii) apresentar formas de melhorar a performance de um banco de dados. (iv) gerar scripts para realização da manutenção de um banco de dados e, por fim, (v) manter um histórico das ações desta ferramenta. 1.1. OBJETIVOS 1.1.1. Objetivo Geral Desenvolver uma ferramenta que auxilie no ajuste de desempenho do banco de dados Oracle, cuja função principal é captar dados estatísticos do banco de dados, gerar scripts para realização da sua manutenção e manter um histórico de atuação desta ferramenta. 1.1.2. Objetivos Específicos Os objetivos específicos deste projeto de pesquisa são: • Pesquisar sistemas ou projetos similares; • Especificar requisitos; 3 • Realizar um levantamento de quais recursos o Oracle dispõe para tratamento do seu ajuste de desempenho; • Realizar a modelagem conceitual do projeto para a busca de informações dos dados estatísticos e como disponibilizar estes dados de modo gráfico; • Realizar a modelagem conceitual do projeto para gerar script de ajuste de desempenho; • Realizar a modelagem conceitual do projeto para gerar o histórico da ferramenta; • Implementar a ferramenta; • Testar e validar a ferramenta ; e • Documentar o desenvolvimento do trabalho de conclusão de curso; 1.2. METODOLOGIA As etapas para o cumprimento dos objetivos do TCC (Trabalho de Conclusão de Curso) são descritas em seguida. • Redação Pré-Proposta: documento que expõe um visão geral do projeto de conclusão do Curso de Ciência da Computação relatando: introdução do projeto, objetivos, atividades, cronograma e definição de critérios; • Levantamento Bibliográfico: O trabalho (TCCI) iniciou com a pesquisa de material bibliográfico: livros, artigos, periódicos, teses, Internet, a fim de fundamentar teoricamente as tecnologias que deveriam ser abordadas no trabalho; • Revisão Bibliográfica: Nessa etapa, houve então a fundamentação teórica do trabalho através da utilização do levantamento bibliográfico realizado na etapa anterior, bem como o conhecimento adquirido durante a pesquisa. Este período foi acompanhado por reuniões semanais com o orientador e por relatórios quinzenais entregues á coordenação do TCC; • Análise do Projeto: foi realizada a analise do sistema bem como a modelagem do banco. A modelagem foi realizada através de um diagrama de contexto, diagramas de fluxos de dados e especificações de processos, sendo utilizado, também, um diagrama ER (entidade-relacionamento) para banco de dados para o modelo relacional/objetorelacional dos bancos de dados tradicionais; 4 • Considerações Finais: o trabalho é brevemente recapitulando, ressaltando pontos gerais do trabalho de conclusão de curso; • Referências Bibliográficas: lista das referências utilizadas para o desenvolvimento desse trabalho; • Apêndice A: esse apêndice consta a modelagem de dados que será utilizado na implementação da ferramenta foco desse trabalho. Essa modelagem consta o dicionário de dados das tabelas da ferramenta relatando o nome das tabelas, assim como o nome, o tipo e a descrição de cada campo da tabela; • Apêndice B: nesse apêndice consta os algoritmos utilizados na implementação da ferramenta. Entre as informações contidas nesses algoritmos estão as instruções SQL; e • Anexo: Como anexo do trabalho de conclusão de curso esta o artigo apresentado no XIX Congresso Regional de Iniciação e Tecnológica em Engenharia - CRICTE 2004, com o tema “Desenvolvimento de uma Ferramenta para Análise de ajuste de Desempenho do Banco de Dados Oracle”. 1.3. ESTRUTURA DO TRABALHO Este trabalho tem como finalidade auxiliar na análise e no ajuste de desempenho do banco de dados Oracle. Para tanto, a primeira etapa deste trabalho foi fazer um levantamento bibliográfico sobre: banco de dados Oracle; sistema de gerenciamento de banco de dados; conceito de ajuste de desempenho; ajuste de desempenho no banco de dados Oracle; e projetos/ ou sistemas similares. No tópico sobre o banco de dados Oracle é relatado informações referentes a sua historia. Em sistema de gerenciamento de banco de dados dá-se uma noção de como é tratada a estrutura física e lógica de um banco de dados, assim como a estrutura da memória. Na etapa de conceituação de ajuste de desempenho, são retratados seis passos fundamentais para a realização de ajustes de desempenho de um banco de dados. Ao se falar sobre ajuste de desempenho, então são focados conceitos sobre administração de banco de dados e justamente o ajuste de desempenho no banco de dados Oracle. 5 Por fim, então é apresentada a modelagem da analise do projeto a ser desenvolvida na segunda etapa do trabalho de conclusão de curso. 6 2. FUNDAMENTAÇÃO TEÓRICA Como pontos da fundamentação teórica desse trabalho de conclusão, estão 05 tópicos: banco de dados Oracle; Sistema Gerenciador de Banco de Dados; Conceito de Ajuste de Desempenho; Ajuste de Desempenho; Ferramentas de Tuning para Oracle; e Estudo sobre Sistemas e/ou Projetos Similares. 2.1. BANCO DE DADOS ORACLE O banco de dados foco desse trabalho de conclusão de curso será o Oracle 9i. Nesse capitulo será mostrado seu histórico. 2.1.1. A Historia do Banco de Dados Oracle A historia do banco de dados Oracle começou em 1970, quando Ted Codd lançou um modelo de dados relacional, tendo como protótipos o System R e o Ingress. O System R foi desenvolvido pela IBM, porém, ainda era um modelo não-comercial de banco de dados. Já o Ingress, teve seu desenvolvimento na Universidade de Berkeley, na Califórnia, pela equipe liberada por Michael Stonebaker (FANDERUFF, 2003). A linguagem SQL, que atualmente é padrão para linguagem de banco de dados relacional, foi desenvolvida a partir do System R. Nesse período (1977), então surge a Software Development Laboratories, através de Bob Miner, Ed Oates, Bruce Scott e Larry Ellison, que ate então eram analistas de sistemas que, ao estudarem sobre os dois sistemas acima citados, decidem lançar uma versão comercial de um produto similar (ibidem). De acordo com Oracle (2004), nessa época Larry Ellison vislumbrou, ao encontrar uma descrição de um protótipo funcional de um banco de dados relacional, uma oportunidade que outras companhias não haviam percebido, a de comercializar essa tecnologia. Porém, Ellison e os confundadores da Oracle, Bob Miner e Ed Oates, não imaginavam de que transformariam “a cara da computação empresarial para sempre”. A empresa, em 1979, mudou o seu nome para RSI (Relational Software Incorporated), sendo então gerado a primeira versão do Oracle, mais conhecido como Oracle V2, tendo como primeiro cliente a Base da Força Aérea Patterson. Essa versão do Oracle rodava em uma maquina DEC PDP 11(FANDERUFF, 2003). Nesse mesmo na oferece o primeiro sistema comercial de gerenciamento de banco de dados relacionais SQL (ORACLE, 2004). Quando a RSI mudou seu nome para Oracle, em 1983, o Oracle V3 já rodava em PCs e mainframes, tornando-se o sistema mais potável do mundo (FANDERRUFF, 2003). No decorrer dos anos 80, Oracle (2004) relata que outras inovações foram desenvolvidas, entre elas: • Disponibiliza um primeiro banco de dados desenvolvido em C, para portabilidade (1983); • Oferece o primeiro banco de dados com consistência de leitura (1984); • Oferece o primeiro banco de dados para servidores em paralelo (1985); • Fornece suporte consultas distribuídas e desenvolve o primeiro banco de dados cliente/servidor (1986); e • Primeiro banco de dados a oferecer bloqueio no nível de linhas e a introduzir o PL/SQL (1988). Nas versões mais atuais, tem-se Oracle 08, lançada em 1997, que já comportava um limite de 512 petabytes (um petabytes equivale a 1024 x 1024 x 1GB) de informações, além de ser um sistema gerenciador de banco de dados objeto-relacional. Já em 1999, com o crescimento da Internet, foi lançado o Oracle 8i, voltado para aplicações eb, sendo que, juntamente com a versão 9i, tem o desempenho e a escalabilidade necessárias para suportar essas aplicações (FANDERUFF, 2003). A versão focada neste trabalho é a versão 9i, que teve seu lançamento em 1º de Junho de 2001. Em relação a versão anterior, essa versão apresenta avanços em clusterização, confiabilidade e performance(ibidem). Como respaldo mundial. O Oracle 9i ganhou prêmios, como: Database para Linux (Linux Journal); Business Intelligence (DM Review); e o Recorde mundial de data warehousing (TCP-H) (ORACLE, 2004). 8 Além disso, segundo estudo da Harte-Hanks, três vezes mais clientes do banco de dados Informix pretendem migrar para o Oracle do que para o concorrente (FANDERUFF, 2003). 2.2. SISTEMA DE GERENCIADOR DE BANCO DE DADOS ORACLE Ramalho (1999) relata que o Oracle é um banco de dados que possui uma estrutura física e lógica separadas no servidor, sendo que o armazenamento físico dos dados pode ser gerenciado de forma separada do acesso ás estruturas lógicas de armazenamento. Por conseguinte, o sistema gerenciador de banco de dados (SGBD) Oracle, segundo Fanderuff (2003), mantêm fisicamente um conjunto de arquivos em algum ponto do disco. O armazenamento lógico, por sua vez, é dividido em um conjunto de contas de usuário conhecidas como esquemas. Esse esquema é acessado e manipulado através de um usuário, que possui uma senha e privilégio de acesso. A seguir essas estruturas serão detalhadas e caracterizadas: 2.2.1. Estrutura Física De acordo com Ramalho (1999), a estrutura física do Oracle é determinada pelos arquivos do sistema operacional que o constituem. Então, para cada banco de dados Oracle há pelo menos: um arquivo datafiles, dois arquivos redo e um arquivo de controle. Abaixo estão listadas as características de cada um desses arquivos. Após, a Figura 1 ilustra a estrutura física do Oracle. • Datafiles: o Descrição: De acordo com Fanderuff (2003), datafiles é um conjunto de arquivos onde as informações estão efetivamente armazenadas, ou seja, os datafiles armazenam os dados das tabelas, os índices e as áreas temporárias e de rollback; o Funcionamento: Scherer (2002) relata que os dados armazenados nos datafiles são recuperados conforme a solicitação do cliente. Esses dados são alocados em uma memória real do servidor, tornando-a disponível para que os demais usuários possam acessar de forma mais rápida; e o Gerência: Como cópia de segurança para os dados contidos nos datafiles deve ser realizado regularmente backup desses arquivos. Alguns sistemas operacionais podem 9 mostrar restrições ao tamanho do datafile, nesse caso, recomenda-se que um datafile não ultrapasse o tamanho de 2GB. (FANDERUFF, 2003). • Redo log files: o Descrição: Fanderuff (2003) relata que os arquivos redo log files são utilizados para armazenagem de transações realizadas no banco de dados com a finalidade de refazer as operações quando da perda de dados; o Funcionamento: Scherer (2002) diz que a função do arquivo redo log file é garantir a armazenagem de todas as alterações realizadas sobre os dados do banco de dados. Dessa forma é possível a recuperação para um estado seguro do banco de dados no caso de uma eventual falha; e o Gerencia: Há a necessidade de dois grupos de arquivos para quando um estiver cheio o outro possa ser utilizado. Se possível, manter os arquivos em discos diferentes para evitar gargalos, devido a um grande numero de gravação. (FANDERUFF, 2003). • Control files: o Descrição: Scherer (2002) conta que toda vez que o banco de dados é inicializado o arquivo control file é lido para localização dos arquivos datafiles e redo log files. As alterações nesses arquivos, assim como as alterações estruturais no banco de dados, são registradas no arquivo control file. Um exemplo de alteração no banco de dados é a inclusão de um novo arquivo datafile; o Funcionamento: Scherer (2002) diz que um arquivo control file contém ponteiros que especificam a estrutura física do banco de dados. Entre as informações do banco de dados estão: nome do banco de dados; nomes e localizações dos datafiles e dos redo log files, arquivo de redo log corrente, e time stamp de criação do banco de dados; e o Gerência: Deve ser realizada regularmente uma cópia do arquivo control files, assim como ter cópias distribuídas em diferentes discos para garantir uma maior segurança. (FANDERUFF, 2003). 10 Datafiles Control Files Redo Logs Files Figura 1: Estrutura Física Fonte: Adaptado de Fanderuff (2003) 2.2.2. Estrutura da Memória O Oracle divide a memória RAM (Random Access Memory) em duas partes (ZEGGER, 2001): • O SGA (system global area) é um grupo das estruturas de memórias compartilhadas que, quando combinadas com os processos do Oracle, compreendem uma instância do Oracle. É dividido em quatro áreas: database buffer cache; redo log buffer; e shared pool; e • O PGA (process global área) é onde a memória é alocada a cada processo conectada a base de dados. O tamanho deste alocamento é estático. O tamanho do PGA é dependente do sistema, mas é afetado pelos seguintes parâmetros: open links; db_files; e log_files. A figura 2 mostra como é a estrutura da memória do banco de dados Oracle. 11 Figura 2. Estrutura de memória utilizada pelo banco de dados Oracle Fonte: Adaptado de Zegger (2001) O DB Buffer Cachê mantém cópias de todos os blocos de dados que são lidos do data files. O Oracle mantém uma lista de blocos sujos e a LRU (Least Recently Used) para decidir-se que blocos devem ser mantidos na memória. Os blocos sujos são blocos update escritos e ainda não atualizados em disco. A lista de LRU identifica que são buffers livres, buffers fixados, ou buffers sujos que não foram removidos ainda da lista suja. Se um processo que esteja tentando executar leitura não encontra um buffer livre na lista LRU, então são utilizados esses buffers sujos (ZEGGER, 2001). O Redo Log Buffer é um buffer circular com um tamanho fixado. É nessa memória que os dados alterados são armazenados até a sua transferência para o redo log files. Ressalta-se que os dados aqui guardados não são os dados reais propriamente ditos, mas sim as instruções insert, delete e update para construção e alteração do banco de dados. Na pratica, quando acontece um update, por exemplo, é guardada essa instrução que passa da situação A (atual) para a situação B (após o update), além dessa instrução, também é guardada uma instrução que equivalente ao rollback, ou seja, da situação B (após o update) para A (atual) (FANDERRUFF, 2003). Quando o Oracle necessita executar uma tarefa que requeira a classificação dos dados o Sort Area é usada. Um processo do Oracle pede uma Sort Area. Essa Sort Area pode crescer até o tamanho do parâmetro SORT_AREA_SIZE e, se esta quantidade de memória não for suficiente a 12 sort transbordará no disco. O processo pode liberar a sort area que não está sendo usada para a SORT_AREA_RETAINED_SIZE (ZEGGER, 2001). Para Java Pool, Maring (2002) diz que Java foi desenvolvido para impedir a alteração do seu sistema trabalhando através de pacotes (applets), sendo assim uma linguagem segura. Esta é a única razão para que o Oracle permita que aplicações Java possam dar carga dentro da base de dados. Linguagens, tais como o C, podem apresentar problemas de segurança na base de dados. Por default não é disponibilidade espaço desta memória no banco de dados, porém, podendo ser modificado através do parâmetro java_pool_size. O Large Pool é utilizado pelo Oracle para armazenar diferentes tipos de dados. Os dados armazenados se referem a execução de blocos PL/SQL e de comandos SQL, dados da dictionary cache, entre outros. (GREEN, 2002). O Shared Poll é dividido em duas memórias cachês: Dicionário Cachê e Biblioteca Cache. Os tamanhos são dinâmicos, de forma que aumentam e diminuem de acordo com a necessidade, porém, se limita ao tamanho da shared pool. O custo por falta de memória na Shared Poll é mais alto do que no buffer cache (ibidem). Ressalta-se ainda que, quando uma instancia é iniciada, de acordo com URMAN (1999), também são inicializados uma serie de processos em paralelo (Figura 3). Esses processos se comunicam justamente através da SGA e, entre suas finalidade está a leitura e escrita em escrituras de dados. Usuário Usuário Usuário Processos de usuário Usuário System Global Area (SGA) Recover (RECO) Process Monitor System Monitor (SMON) Database Writer (DBWO) 13 Log Write (LGWR) Archiver (ARCO) Figura 3. Inicialização de uma instância no Oracle Fonte: Adaptado de Ramalho (1999) A seguir estão descritos os principais processos Oracle: • LGWR (Log Writer): é através desse processo que é gravado o conteúdo do redo log buffer para o redo log files. Esse processo é ativado a cada gravação de 300KB no redo log buffer, ou a cada commit, ou a cada 3 segundos; • DBWR (Database Writer): os dados são carregados para o database buffer cache através das operações de seleção(select, update, insert e delete), sendo esse o processo que grava os dados alterados para os datafiles; • CKPT (Recover): esse processo sincroniza os datafiles e os control files; • SMON (System Monitor): desfaz tudo o que estava pendente de validação quando houver um crash no banco de dados, limpando as áreas temporárias do banco de dados; e • PMON (Process Monitor): processo chamado quando da ocorrência de interrupções anormais, desfazendo transações e deslocamento registros. 2.2.3. Estrutura Lógica A estrutura lógica de um banco de dados, de acordo com Ramalho (1999), é dividida em unidades lógicas de armazenamento chamadas de tablespace. Sendo assim, uma tablespace é uma estrutura lógica que dita o espaço físico do banco de dados. Há diversos tipos de tablespaces, como: tablespace system, onde um único tablespace é criado para cada base de dados; e tablespace UNDO, sendo exclusivo para armazenamento de informações UNDO, podendo existir mais de uma tablespace deste tipo; default temporary tablespace. (CYRAN, 2002) Uma base de dados muito pequena pode necessitar apenas da tablespace system, entretanto, de acordo com Cryan, 2002, o Oracle recomenda a utilização de ao menos uma tablespace adicional para armazenar os dados do usuário separadamente do dicionário de dados, dando flexibilidade às operações de administração de banco de dados e, também, irá reduzir as disputas entre objetos do dicionário de dados e o dos schemas para os mesmos datafiles. 14 Para esta tablespace adicional de armazenamento, segundo Fanderuff (2003), o ideal é ter uma para os dados e outra especificamente para índices. Com essa estrutura, fica mais fácil identificar e administrar, por exemplo, o quanto cada instituição ou departamento de uma empresa utiliza em espaço em disco. Por fim, uma tablespace é dividida em um ou mais datafiles, sendo estes divididos em segmentos (tabelas), que são constituídos por extents e, por fim, por blocos. Para entender melhor, tem-se a Figura 4 mostrando essa estrutura lógica (ibidem). Tablespace Segmento Segmento Bloco Extent Bloco Extent Figura 4. Estrutura Lógica Fonte: Adaptado de Fanderuff (2003) Ressalta-se que visões, procedimentos, funções e pacotes não ocupam segmentos na tablespace de armazenamento, sendo essas armazenadas na tablespace system. Após, a figura 5 mostra a estrutura de um bloco de dados. Um bloco de dados possui a seguinte estrutura no banco Oracle: • Cabeçalho: espaço para identificação do bloco; • Espaço Livre: reserva um espaço no bloco para futuras atualizações. Dessa maneira, quando da alteração dos dados de determinado bloco de dados, essas alterações continuam no mesmo bloco de dados melhorando, assim, o seu desempenho, e • Data: espaço de armazenagem dos dados. 15 Cabeçalho Tabela Diretório Linha Diretório Espaço Livre Dados Armazenados Figura 5. Estrutura de um bloco de dados Fonte: Adaptado de Ramalho (1999) Como o bloco de dados é utilizado para o armazenamento de dados, o Oracle possui um parâmetro chamado PCTUSED que informa se o bloco de dados faz parte de uma lista de blocos com espaço livre ou não. Quando o bloco de dados ultrapassa um valor de preenchimento o parâmetro informa que este bloco não está disponível. (RAMALHO, 1999) Por fim, esse bloco de dados, quando já não faz parte da lista de blocos com espaço livre, mesmo que tenha dados excluídos retornando, assim, a ter espaço livre, para que ele volte a fazer parte da lista de blocos livres é necessário que esse espaço ultrapasse um determinado tamanho especificado no parâmetro acima citado (FANDERUFF, 2003). 2.2.4. Seqüência de UNDO Há duas formas de acesso ao banco de dados, uma visa á consulta através de um select e, a segunda forma, é realizada através da escrita, utilizando insert, update e delete. Quando um usuário está fazendo a leitura de um dado, esse não pode star em modificação, da mesma maneira que um dado não pode ser modificado por duas instruções distintas. De acordo com Fanderuff (2003), para tratar esta questão o Oracle mantêm uma cópia original dos dados em um segmento UNDO antes da sua alteração, sendo esse segmento visualizado quando um outro usuário acessar. Um dado passa para o estado de alterado e os demais usuários acessam esse através do segmento UNDO. Quando uma validação de comando é executada (commit), então o seu estado volta a ser liberado e o bloco pode ser sobreposto mostrando, então, os dados alterados para os demais usuários. Quando acontece um cancelamento de escrita (rollback) é justamente o segmento de UNDO que irá atualizar novamente o banco de dados com as 16 informações anteriores. Recomenda-se utilizar o commit somente no final do processo para aumento do desempenho, não necessitando continuamente a repetição desse processo. 2.3. CONCEITO DE AJUSTE DE DESEMPENHO Em sistemas de banco de dados relacionais, de acordo com Date (2000), o ajuste de desempenho é uma exigência para alcançar um desempenho desejado em um banco de dados. Além disso, esse ajuste passa a ser uma oportunidade para que sistemas relacionais sejam tratados a níveis mais altos, através de otimizadores, não ocorrendo a necessidade de usuários saberem programar o sistema a níveis mais baixos, diminuindo os custos de sua realização. Desta maneira, com o ajuste de desempenho, o sistema por si próprio executa operações a níveis baixos através da otimização automática do sistema, permitindo um acesso ao usuário a um nível mais alto e fácil de trabalhar. A utilização de uma ferramenta para ajuste de desempenho é fundamental para esse processo. De acordo com Date (2000), o objetivo geral de uma ferramenta de ajuste de desempenho é avaliar a estratégia mais eficiente para implementação de uma expressão racional. A seguir, estão relacionados motivos para realização da sua utilização: • Uma ferramenta tem grande quantidade de informações estatísticas que normalmente o usuário não obtém, sendo estas: o O número de valores em cada domínio; o O número atual de registros em cada variável de relação básica; o O número atual de valores distintos em cada atributo de cada variável de relação básica; e o O número de vezes em que ocorre cada um desses valores distintos em cada um de tais atributos. • Através dessas e de diversas outras informações, a ferramenta deve avaliar qual estratégia adotar para aperfeiçoar as implementações das requisições. • Com o decorrer do tempo, através da utilização do banco de dados, as estatísticas acabam mudando também, sendo necessário uma nova otimização e uma nova 17 estratégia. Se compararmos esse trabalho com um sistema não relacional, o ajuste representa a reescrita da programação. • A ferramenta, por ser um programa, é capaz de realizar centenas de estratégias de implementação para uma única requisição, sendo que o ser humano se limita a realizar três ou quatro maneiras de implementação. • A ferramenta é o resultado da junção de conhecimentos de diversos programadores. Desta maneira, os conhecimentos nele empregados são comum uso para todos. Na visão de Silberschatz & Korth (1999), ajustar o desempenho de um banco de dados (otimização) consiste no ajuste de diversos parâmetros e na projeção de escolhas para a sua melhoria para cada aplicação Entre esses parâmetros estão os tamanhos do buffer, podendo se estender a aspectos do projeto, como a constituição de esquemas e de transações e também chegar a um nível de hardware, como no numero de discos utilizados. Todos esses aspectos interferem no desempenho de uma aplicação, assim como todos esses aspectos podem ser ajustados buscando uma melhoria do seu desempenho. A seguir serão apresentados pontos que o autor destaca como passos para a busca do ajuste de desempenho: 2.3.1. Localização de Gargalos Um gargalo é um componente que realizada determinada função, cujo tempo de execução influi de forma definitiva no desempenho de um sistema. Como exemplo de gargalo, uma aplicação pode ter uma função que represente 80% do tempo total de sua execução. A localização e o ajuste dessa função irá melhorar de forma significativa o andamento do sistema. Se essa função for melhorada em 50 % do seu desempenho, então o seu ajuste irá representar 40% do desempenho total da aplicação. Porém, quando da eliminação de um gargalo, novos gargalos podem aparecer, e o processo de localização e eliminação continua até que o sistema esteja equilibrado e que nenhum componente de forma isolada se torne gargalo. Na visão de sistemas mais simples, o tempo gasto em cada parte da aplicação influencia no tempo total da execução. Porém, um sistema de banco de dados envolve uma complexidade maior, ocorrendo necessidades de vários serviços, como entrada de processos no servidor, leitura de discos, ciclos de CPU e controle de concorrência. Esses serviços, por sua vez, estão amarrados a uma fila 18 de pequenas transações, onde pode prejudicar o desempenho, especialmente no que diz respeito a filas de I/O de disco. Uma forma de construção de gargalo são justamente essas filas, onde esperam a liberação de determinados componentes. O ideal é manter um recurso com tempos de espera para a sua utilização baixa o suficiente para que o comprimento da fila seja curto. 2.3.2. Parâmetros Ajustáveis Há três níveis de ajuste que um administrador pode realizar em um sistema de banco de dados, sendo esses: • O primeiro nível é também considerado o mais baixo, sendo este de hardware. A utilização de um ou mais discos, aumento da memória e aumento do buffer de disco são exemplos de ajustes; • Os parâmetros do sistema de banco de dados é o segundo nível de ajuste. Cada banco de dados tem o seu próprio conjunto de ajuste de parâmetros. Muitos desses bancos também ajustam os parâmetros de forma automática observando indicadores, como, por exemplo, taxas de página por acesso (page-fault); e • O terceiro e mais alto nível é o ajuste de esquemas e transações. Esse nível é em parte independente do sistema. De forma geral, os três níveis trabalham de forma conjunta para o perfeito ajuste do sistema. A tabela 1 a seguir mostra uma diversidade de parâmetros envolvidos no desempenho de banco de dados. Tabela 1. Parâmetros envolvidos no desempenho do banco de dados. Nome do Parâmetro ARCHIVE_LAG_TARGET Descrição Quantidade de dados que pode ser perdida. Valores muito baixos, resultam em LOGs freqüentes, o que diminui o desempenho. BITMAP_MERGE_AREA_ Tamanho da memória usada para a união de SIZE bitmaps CREATE_BITMAP_AREA_ Tamanho da memória alocada para criação de SIZE bitmaps DB_BLOCK_SIZE Tamnho padrão dos blocos de dados. Esse parâmetro é estabelecido na criacao do BD e não deve ser alterado 19 Padrão O IMB IMB No NT é 8MB DB_CACHE_SIZE DB_Nk_CACHE_SIZE HASH_JOIN-ENABLED LARGE_POOL_SIZE LOG_ARCHIVE_XXX OPTIMIZER_DYNAMIC_S AMPLING OPTIMIZER_FEATURES_E NABLE OPTIMIZER_INDEX_CAC HING OPTIMIZER_INDEX__COS T_ADJ OPTIMIZER_MAX_PERM UTATIONS OPTIMIZER_MODE PGA_AGGREGATE_TARG ET PRE_PAGE_SGA QUERY_REWRITE_ENAB LED QUERY_REWRITE_INTEG RITY SGA_MAX_SIZE Tamanho padrão para blocos de buffers de cache Tamanho para blocos de buffers de cache para caches adicionais de n Kbytes. Como o DB_BLOCK_SIZE é 8MB, o parâmetro a ser utilizado deve ser o DB_8K_CACHE_SIZE. Informa se o otimizador deve ou não deve usar Hash Tamanho de large pool da SGA para servidores compartilhados Disponibiliza os arquivamentos de log e de redo. Neste caso XXX representa os vários parametrtos de uma mesma familia, ou seja, LOG_ARCHIVE_DEST, LOG_ARCHIVE_DEST_n, LOG_ARCHIVE_STATE_n, LOG_ARCHIVE_DUPLEX_DEST,..., LOG_ARCHIVE_TRACE. Por este motivo, não há um valor padrão, pois cada parâmetro pode assumir um valor diferente. Controla o nível de amostra dinâmica realizada pelo otimizador ( de 0 a 10) Habilita características do otimizador, conforme a versão do Oracle Comportamento da otimização baseada em custo. Favorece junções de loop aninhado e iteração IN-list (de 0 a 100) Permite o ajuste do comportamento do otimizador para seleção de caminhos de acesso, fazendo-o mais ou menos propenso a usar um caminho de acesso pelo índice ao invés de fazer uma pesquisa, na tabela inteira (de 1 a 10000) Número de permutações da tabela que o otimizador vai considerar em buscas com junção Comportamento padrão para a escolha de uma abordagem de otimização para a instância Meta de memória PGA agregada disponível aos processos do servidor pertencentes á instância Traz (TRUE) ou não traz (FALSE) a SGA inteira para a memória ao iniciar a instancia Define o uso (TRUE) ou não (FALSE) de reescrita nas operações de busca Usa índices baseados em função para obter valores somente de expressões SQL. O parâmetro padrão, ou seja, ENFORCED, significa que o Oracle reforça e garante a integridade e a consistência dos dados. Tamanho máximo para a SGA. Se a soma de seus componentes for maior, esse parâmetro é 20 No NT é 24 MB 8 TRUE 8MB 1 9.2.0 0 100 2000 CHOOSE No NT é 24MB FALSE FALSE Enforced 130 MB SHARED_POOL_RESERV ED_SIZE SHARED_POOL_SIZE SORT_AREA-SIZE SQL_TRACE ignorado. Espaço da shared pool reservado para grandes requisições contíguas de memória No NT é de aproximadamente 2,4 MB ou 2516582 Bytes Tamanho da shared pool da SGA No NT é 48MB Tamanho Maximo para operações de ordenação 64 KB Habilita (TRUE) ou desabilita (FALSE) a FALSE facilidade de trace para SQL.Estando habilitado, esse parâmetro provê informações para o ajuste de Desempenho. Fonte: Adaptado de Flores (2003) 2.3.3. Ajuste de Esquemas O ajuste de esquemas é realizado nas formas normais adotadas atraves de participações verticais, como mostra o exemplo abaixo, de acordo com Silberschatz & Korth (1999): Conta(nome_agencia, numero_conta, saldo) Nesta forma, a relação conta ainda pode ser particionada em duas partes, ficando desta maneira: agencia(numero_agencia,nome_agencia) conta_saldo(numero_agencia,numero_conta,saldo) Como resultado desta participação, duas relações foram criadas, porém, a chave (campo numero_conta) irá ser repetida em ambas. Vantagens dessa participação são: • Caso as consultas sejam mais intensas para número da conta e de saldo, a resposta dos acessos irá ser bem mais rápida pelo fato do campo nome_agencia que, naturalmente, possui um tamanho relativamente grande, não ser pesquisado. • Da mesma forma, o buffer irá comportar mais registros de contas, pois o tamanho dos resultados irá ser menor. Desvantagens dessa partição são: 21 • Se as consultas, por sua vez, tiverem intensidade em saber também o nome da agência, então o custo da transação irá ser maior, pois a necessidade da junção representa um aumento de custo. • O armazenamento em buffer também será maior, pois o campo numero_conta irá ser replicado. 2.3.4. Ajuste de Índices Um número grande de índices não representa necessariamente um melhor desempenho do banco de dados, pois em muitos casos o próprio índice representa o gargalo, sendo a exclusão de determinados índices e a criação de outros índices mais apropriados a solução para esse caso. Há casos em que o gargalo é a atualização do banco de dados, onde os índices são alimentados, causando então um alto custo para a sua realização. A remoção de índices pode ser a solução. Também é importante definir qual o tipo de índices deve ser utilizado, tendo como opções, de forma geral para os bancos de dados, os índices hash e os índices de arvore-B. Ainda tem-se a opção de transformar índices em índices cluster, que nada mais é do que índices agrupados, onde apenas um índice da relação é o índice cluster, sendo este geralmente o que irá trazer um melhor desempenho, beneficiando o maior número de consultas e atualizações. Por fim, Peasland (2000) relata que um índice é armazenado geralmente em uma estrutura de dados b-tree, formada de nós de folhas (ponteiros). Quando um registro é apagado a entrada no nó da folha é removida. Caso nenhum outro registro ocupar esse nó da folha, então este permanecerá para sempre vazio, aumentando o custo de sua utilização, a menos que o DBA venha a reconstruir o índice. Sendo assim, o mesmo autor diz que antes de decidir o que fazer com o índice é necessário saber do seu estado atual, que pode ser visualizado através do comando ANALYZE INDEX VALIDATE STRUCTURE. Através deste comando, estatísticas são computadorizadas na tabela SYS.INDEX_STATS, como mostra o script a seguir: SQL> ANALYZE INDEX shopping_basket_pk VALIDATE STRUCTURE; Statement processed. 22 SQL> SELECT name,height,lf_rows,lf_blks,del_lf_rows,distinct_keys,used_space FROM INDEX_STATS; NAME HEIGHT LF_ROWS LF_BLKS DEL_LF_ROW DISTINCT_K USED_SPACE ---------------------------- ------- ------- ----------------------- ---------SHOPPING_BASKET_PK 2 1 3 1 1 65 1 row selected. Duas regras podem ser adotadas para determinar se o índice necessita ser reconstruído, onde pode ser facilmente realizado pelo comando ALTER INDEX REBUILD. A primeira regra é verificar se o índice tem um tamanho igual ou maior do que três nós, sendo que o normal é ter um ou dois, mas há suas excessões. A segunda regra é que a porcentagem de nós de folhas apagadas num índice não deve ultrapassar o total de vinte por cento. (PAESLAND, 2000). 2.3.5. Ajuste de Transações As transações, tanto para consultas como para atualizações, podem ser escritas de forma em que possam beneficiar o desempenho do banco de dados. Porém, nos últimos anos, os sistemas têm melhorado bastante a interpretação das escritas transacionais, onde até mesmo uma transação mal produzida pode ser executada de forma eficiente. Além disso, muitos sistemas fornecem mecanismos para visualização do plano exato de execução, podendo ser utilizado para determinados ajustes. Uma forma de melhorar o desempenho de uma consulta está através do SQL embutido, onde tem como característica a obtenção de diferentes valores para um único parâmetro. Como exemplo tem-se uma empresa com diversos setores, onde cada setor é visto separadamente de acordo com sus atividades. A melhora nesse caso pode ser obtida através do agrupamento de informações por cada setor, onde não há a necessidade de varrer todos os registros relativos aos setores para buscar as informações quando da necessidade de uma consulta, bastando filtrar apenas os dados agrupados de determinado setor.Em um sistema cliente-servidor, os custos são diminuídos de forma acentuada, melhorando bastante o desempenho do sistema. Uma segunda forma de melhorar o desempenho de comunicação em sistemas clienteservidor está na utilização de stored procedures (procedimentos armazenados), em que transações ficam no servidor na forma de procedimentos que são disparados ao invés da transmissão de toda a transação. 23 A melhoria de desempenho também pode ser alcançada através da execução de determinadas transações em horários com pouca utilização do sistema, como no horário noturno. Como justificativa a essa afirmação, tem-se como exemplo um sistema bancário onde durante o dia são realizadas de forma contínuas pequenas transações onde, na ocorrência de uma transação que envolva diversas relações importantes irá bloquear todas as demais transações. Isso acontece devido a execução concorrente, onde uma transação é bloqueado até que determinada relação seja liberada para acesso. Especificamente para transações de atualização, o custo pode ser maior devido á utilização ainda do sistema de log e do tempo gasto para recuperação de quedas. Ainda há o risco do sistema de log ficar cheio antes mesmo da transação se completar, ocorrendo a necessidade de refazer essa transação. A utilização de transações com poucas atualizações, porém, que resultem em custos altos, também devem ser evitadas, pois partes antigas do sistema log não podem ser removidas, podendo levar ao mau uso do sistema log. Alguns sistemas para evitar esses problemas de atualizações, mantêm limitados os números de atualização de uma transação. Outros sistemas, por sua vez, quebram a transação em diversas partes, surgindo os chamados mini-batch (mini-lote). Porem, utilizar mini-lote requer cuidado, como no caso da ocorrência de transações concorrentes, sendo que a ultima transação poderá não refletir o mesmo do que se fosse feito em uma única abordagem. Também problemas podem surgir quando da ocorrência de falhas. 2.3.6. Simulação de Desempenho A simulação consiste em testar o desempenho do sistema antes mesmo da sua instalação ou da ocorrência de qualquer mudança. Sendo assim, muito do sistema deve ser simulado, como por exemplo, o tempo de serviço gasto no processamento de determinadas solicitações, envolvendo nas simulações informações como: CPU, discos, buffer, entre outras. Cada solicitação de processamento pode ser executada em paralelo ou através do enfileiramento, onde um processo espera o desalocamento de determinado recurso para sua utilização. Esta fila de espera é atendida de acordo como o sistema foi projetado, podendo ser pela ordem de chegada das solicitações ou através de prioridades de execução, por exemplo. 24 Uma vez desenvolvido o modelo de simulação varias informações podem ser obtidas, podendo também variar os dados de entradas, assim como os parâmetros utilizados, a fim de observar a sensibilidade e o desempenho do sistema em situações adversas. 2.4. AJUSTE DE DESEMPENHO 2.4.1. Administração Básica de Banco de Dados Um banco de dados tem a finalidade de auxiliar na organização e na recuperação de dados. Não necessariamente um sistema de processamento de dados utiliza um SGBD (Sistema de Gerenciamento de Banco de Dados) para recuperação de informações, sendo que nesse caso, cabe ao desenvolvedor criar formas dessa recuperação. Porém, quando o acesso a um banco de dados é realizado através de um SGBD, cabe ao gerenciador assumir a responsabilidade de buscar todas as informações especificas (FANDERUFF, 2003). Então, como já citado nesse trabalho, a principal função de um SGBD é ter o controle centralizado dos dados, onde o DBA (Database Admistrator) é responsável por esse controle. O DBA, por sua vez, possui diversas funções que, entre elas, estão: definir quais dados serão armazenados e quais os acessos mais freqüentes; disponibilizar os dados desejados pelo usuário; fazer regras de acessos e criar métodos para evitar inconsistência de dados; definir quando e de que formas serão realizadas o backup e como realizar a recuperação de informação quando da perda ou danificação dos dados; e ajustar o sistema para obter o melhor desempenho do banco de dados (ibidem). De acordo com Flores (2003), um banco de dados tem que se adaptar a qualquer situação, porém, nem sempre pode atingir o máximo de desempenho que esse pode oferecer a uma aplicação especifica. Como ressalva a esse problema, o mesmo autor ressalta que a realização de testes relata onde o banco de dados melhor se comporta e, ao contrário, onde este tem um pior desempenho, necessitando apenas de ajuste dos parâmetros de inicialização do banco e da medição de desempenho em consultas e atualizações do mesmo. Flores (2003) dizem que há cerca de 250 parâmetros que configuram o sistema do banco de dados Oracle, sendo o DBA o responsável pela sua configuração e manutenção. Quando há uma modificação dos parâmetros do banco de dados, alguns desses exigem a sua reinicialização, porém, 25 no caso do Oracle, grande parte desses parâmetros muda dinamicamente sua configuração em tempo de execução. Esses parâmetros, ainda de acordo com Flores (2003), são classificados em três tipos, caracterizados por seu tipo de interrupção para mudar seu valor: • Parâmetros Estáticos: São parâmetros que quando da sua modificação há a necessidade de reiniciar o sistema. Tem-se como exemplo deste parâmetro o DB_BLOCK_SIZE, onde os tamanhos das tabelas e dos índices não podem ter tamanhos diferentes de blocos, ocorrendo numa recriação completa da base de dados quando da sua alteração. Ressalta-se que a modificação do parâmetro acima citado irá também necessitar da reconstrução do banco dos dados; • Parâmetros Semi- Dinâmicos: Os parâmetros alterados, nesse caso, não exigem uma reinicializacao do sistema, contudo, esses parâmetros ainda ficam por um tempo indisponíveis para uso; e • Parâmetros Dinâmicos: Ao contrario estáticos, a alteração dessa classe de parâmetro pode acontecer a qualquer instante, sem necessidade de reinicializacao do sistema e nem de uma espera para a sua utilização. O autor acima citado ainda destaca a divisão de parâmetros através de dois campos de atuação, sendo: através dos parâmetros SGA (System Global Area), onde o banco Oracle torna certas áreas de memória maiores e outras áreas menores, quando da alteração de parâmetros; e através de parâmetros de processo, sendo estes internos, onde o Oracle cria e destrói esses de maneira automática, sem afetar sua disponibilidade. 2.4.2. Performance Tuning De acordo com Senegacnik (2004), há muitas definições do que é um Tuning de banco de dados. Se o tuning está acontecendo em uma transação OLTP (On-Line Transaction Processing) se deve pensar em vários usuários executando milhares ou milhões de pequenas transações por dia. Caso a aplicação seja em um sistema DSS (Decision Support System) tem que trabalhar em ajuste de tempo de resposta. Sendo assim, é muito importante saber que tipo de aplicação em que esta funcionando o sistema. 26 O inicio no ajuste de desempenho é encontrar qual o problema que está tendo na base de dados. As áreas possíveis para ajuste de uma base de dados do Oracle, são: CPU; Memória, Input/Output; Rede; e Software. (SENEGACNIK, 2004a). Para Senegacnik (2004a), a grande regra para ajuste da base de dados é nunca “mude mais um parâmetro ao mesmo tempo”. Isso se dá pelo fato que se mudar mais de um parâmetro de uma única vez, nunca saberá de qual dos parâmetros alterados que resultou a melhoria no desempenho do sistema, principalmente quando não se tem certeza do que fazer. Há diversas maneiras de encontrar os problemas em potencial. O problema mais comum acontece quando em um único sistema o mesmo banco de dados possui aplicações que tem um ótimo desempenho, assim como também possui aplicações que possuem um mau desempenho. Nesse caso, obviamente há um problema com essas aplicações e não na base de dados. Se o problema estiver em um aplicativo que esteja em uso há pouco tempo e inicialmente o desempenho era normal, mas com o passar do tempo seu desempenho esteja piorando, devem-se então procurar indicações de ajuste do SQL. Em 90% desse caso há um ou mais índices que falta e as consultas estão causando varreduras cheias da tabela. Também nos casos em que o crescimento diário das tabelas e índices, novamente no caso da utilização de uma aplicação nova, é grande as chances das estatísticas usadas pelo CBO (cost based optimizer) não estejam exatas. Se estiver sendo usado o CBO, então a analisa das tabelas e índices devem ser realizados regularmente.(ibidem) O desenvolvimento do projeto do banco de dados também é muito importante no ciclo de desenvolvimento da aplicação. Nesse estagio são identificados às entidades, seus atributos e as relações entre si. Normalmente se faz o processo de normalização para conseguir a terceira forma normal.A não normalização correta da base de dados pode acarretar em problemas de desempenho. Um outro problema do projeto é um modelo simples dos dados com triggers complexos da base de dados que usam muitos dos recursos. (SENEGACNIK, 2004a). Fanderuff (2003) também relata que um banco de dados tem sua criação e configuração a partir de um projeto e de cálculos sobre o seu crescimento durante a sua utilização.Porem, a autora destaca que mesmo com todos os cuidados obtidos nessa fase há dois principais motivos para a queda do seu desempenho: a fragmentação dos dados com a sua utilização e não conseguir o comportamento do banco de dados esperado. 27 Quando uns destes casos acontecem, então há dois motivos para sua causa: recursos inadequados e projeto inadequado. Par a resolução desse problema, Fanderuff (2003) também cita a verificação da normalização do banco de dados, assim como verificar se os índices estão condizentes com a realidade e se os arquivos físicos estão corretamente separados e definidos. Se o problema de desempenho na aplicação ainda persistir então há a possibilidade de existir problemas relacionados aos comandos SQL. Esta situação é a mais comum, sendo que quando as indicações críticas irão sendo ajustadas os problemas de desempenho desaparecerão. (SENEGACNIK, 2004b). Para a otimização (tuning) do banco de dados quando a causa é o código SQL, Fanderuff (2003) ressalta que são necessários os seguintes cuidados: • Verificar se as áreas de paginação e SWAP estão de acordo com a realidade do banco de dados; • Se o espaço em disco está sendo utilizado por completo ou se não existe espaço para execução de um processo do banco de dados; e • Limitar o número de aplicações no banco de dados a somente ás necessárias. Caso o banco de dados ainda não tenha o desempenho esperado, mesmo depois da verificação e dos ajustes dos itens acima citados, então há a necessidade de otimização do banco de dados.(ibidem). Senegacnik (2004b) cita dois tipos de otimização, sendo uma baseada em regras (RBO Rule Based Optimizer) e outra baseada em custos (CBO - Cost Based Optimizer). No caso da utilização do CBO é possível que a causa do problema sejam estatísticas recolhidas no começo da fase da produção e que não foram atualizadas. Sendo assim, a primeira regra do CBO é manter as estatísticas atualizadas. Um problema das versões anteriores do Oracle está na não possibilidade de recolher as estatísticas de acordo com o número de mudanças na tabela. Essa otimização é dirigida por estatísticas e suas decisões são baseadas no calculo de custo dos objetos nas declarações SQL, tendo uma melhor performance que o RBO. Os dados estatísticos são obtidos através do comando Analyze, juntamente com o Estimate, que reúne uma amostra das informações do objeto no qual se baseiam suas estatísticas. (SENEGACNIK, 2004b). 28 Antes da versão 7.0 o Oracle tinha somente o RBO que, por sua vez, é dirigida pela sintaxe, não considerando dados estatísticos e suas decisões não são baseadas em cálculos de custo. Nessa RBO, a posição dos nomes das tabelas, assim como as restrições da cláusula where, são fatores importantes para a otimização do banco de dados. (ibidem). Fanderuff (2003) também cita que é importante verificar qual o plano de execução que uma declaração SQL realiza em um banco de dados, onde se pode utilizar o recurso Explain Plan, o qual ilustra a tabela ou índice e a ordem em que estas serão acessadas com a declaração. Este procedimento é extremamente útil para se verificar a forma como o Oracle resolveu a execução de um comando e então interferir para sua melhora de performance. Urmam (1999) destaca que é através desse plano de execução que a base de dados processará a instrução SQL efetivamente, incluindo tabelas e índices que necessitam ter acesso, além, também dos métodos de acesso utilizados, entre outras características. 2.4.2.1. Métodos de Acesso Essa forma que o Oracle resolve a execução de um comando para adotar uma tabela é apresentada de seis formas distintas, sendo essas apresentadas a seguir, de acordo com Fanderuff (2003): • Full Table Scan: Todas as linhas de uma tabela descrita na declaração são retornadas através da pesquisa completa da mesma (do começo ao fim). No RBO pode ainda ser feito por índices e, no CBO, o otimizador é obrigado a fazer a leitura completa em busca de estatísticas para constatar que o pequeno número de linhas possui o menor custo para Full; • Index Unique Scan: Localiza através de um único índice uma única chave; • Index Range Scan: Acessa coluna com múltiplos valores, sendo utilizado range (>,>,<>, between, etc). A comparação = (igual) não é utilizada no range; • Index Full Scan: Ao invés de realizar um range, todo o índice é lido. No CBO, pode ser determinado através da estatística, se é ou não uma boa idéia; • Index Fast Full Scan: é o scan de todos os blocos de índices e os registros não são retornados de forma odenada; e 29 • Rowid: Método mais rápido de acesso. O Oracle recupera um bloco especifico e extrai somente os registros desejados. 2.4.2.2. Join Quando duas ou mais tabelas são unidas o Oracle cria um Result Set (conjunto de resultados) temporário, sendo guardada na tablespace temporary, contendo a combinação de linhas. Há cinco métodos para essa junção, sendo principais os métodos nested loop, sort merge join e hash join .(FANDERUFF, 2003). • Sort Merge Join: É utilizado quando as tabelas têm números de linhas semelhantes e a maioria das linhas são retornadas. O seu funcionamento é baseado na classificação de ambas as tabelas pela coluna de junão. Tem alto custom de operação. Os resultados são vistos após a realização de todo o processo de vinculação; • Nested Loops: É utilizado quando a tabela principal é menor e quando um único índice é definido na coluna de junção. O seu funcionamento consiste na leitura de uma linha da tabela principal e é verificada na outra tabela. O retorno das linhas é quase imediato, não necessitando da total vinculação do processo; • Hash Join: Somente utilizado quando o parâmetro hash_join_enabled é true, sendo disponível para o CBO. O hash join tem como funcionamento a divisão de duas tabelas em partições e a criação de uma memória na base da tabela hash, sendo utilizado para mapear as colunas de junção sem a necessidade de classificar/intercalar. É recomendado para situações onde o tamanho de uma tabela é imensamente superior ao tamanho da outra tabela; • Cluster Join: Utilizado para acesso em tabelas fisicamente clusterizados (método para acessar uma tabela sem a utilização de um índice). As linhas das colunas unidas são alinhadas dentro do mesmo bloco de dados aumentando a eficiência, visto a necessidade de um único I/O do banco de dados; e • Index Join: Se todos os dados de retorno da declaração estiverem em um único índice é dispensada a estrutura subjacente da tabela. Fanderuff (2003) ainda relata dicas para aprimorar a execução de comandos SQL: • Utilizar IN ao NOT (o NOT não permite a utilização de índices); 30 • Utilizar <= e >= ao NOT (o NOT não permite a utilização de índices); • Não realizar cálculos na clásula WHERE ou em colunas indexadas; • Não utilizar índice quando 20% das linhas serão retornadas em uma consulta; e • Utilizar subquerys (subconsultas) somente quando não houver outra solução. A Figura XX mostra a utilização da instrução SQL Explain Plan, baseado em Urman (1999). Cabeçalho EXPLAIN PLAN SET STATEMENT_ID = 'SQL_001' FOR Comando SQL para análise Select Count(P.CD_INSTITUICAO) From PONTOS_APOIOS P, INSTITUICOES I Where P.CD_INSTITUICAO = I.CD_INSTITUICAO And I.CD_MATRIZ = 2; Comando SQL do Explain Plan Select lpad(' ', 2 * (LEVEL - 1)) || operation || ' ' || options || object_name || ' ' || decode(id, 0, 'Cost = ' || position) “Execution Plan” from plan_table start with id=0 and timestamp = (select max(timestamp) from plan_table where id=0) connect by prior id = parent_id and prior nvl(statement_id, 'SQL_001') = nvl(statement_id, 'SQL_001') and prior timestamp <= timestamp order by id, position; Resultado para análise Execution Plan --------------------------------------------SELECT STATEMENT Cost = SORT AGGREGATE NESTED LOOPS TABLE ACCESS BY INDEX ROWIDINSTITUICOES INDEX RANGE SCANIX_01_INSTITUICOES INDEX RANGE SCANIX_01_PONTOS_APOIOS Figura 6. Análise de Explain Plan Fonte: Adaptado de Urman (1999) 2.5. FERRAMENTAS DE TUNING PARA ORACLE De acordo com Niemiec (2003), uma maneira de garantir que o desempenho do sistema seja ótimo é monitorá-lo em busca de pequenos problemas de desempenho antes que possam se tornar grandes problemas. Este monitoramento pode ser facilitado através de ferramentas, como estas a seguir. 2.5.1. Oracle Enterprise Manager (OEM) 31 A ferramenta OEM oferece um ambiente integrado do banco de dados ao DBA através de um console de gerenciamento central e packs adicionais: o diagnostics pack e tuning pack (Niemiec, 2003). A Figura 7 mostra a tela da ferramenta OEM. Figura 7. Ferramenta Oracle Enterprise Manager Entre as suas funcionalidades, estão: a administração completa do Oracle; diagnosticar, modificar e ajustar bancos de dados; programar tarefas em diversos sistemas com intervalos de tempos distintos; compartilhar tarefas entre administradores de banco de dados; entre tantas outras funções (MANAGER, 1998). O que irá ser visto adiante é a descrição de maneira global dos principais recursos da ferramenta OEM. 2.5.1.1. Pasta Instância Entre as diversas pastas da ferramenta OEM, a pasta instância tráz informações sobre sessões individuais, bloqueios, planos de recursos e os parâmetros de inicialização no nível do sistema, como pode ser visto na Figura 8. 32 Figura 8. Funcionalidades da Pasta Instância 2.5.1.2. Pasta Esquemas Esta pasta mostra mais a fundo uma instância, mostrando um esquema individual e os objetos associados a esse esquema (Niemiec, 2003). Entre as opções disponíveis estão: tabelas, índices, visões, seqüências, clusters, entre outras funções. 2.5.1.3. Pasta Segurança Através desta pasta há uma rápida visualização das limitações de acesso de cada usuário individualmente. Entre as funcionalidades estão a alteração de senhas de um usuário, cotas da tablespace, privilégios do sistema e funções atribuídas ao usuário. 2.5.1.4. Pasta Armazenamento Tem como principal função monitorar e modificar tablespace, arquivos de dados e segmentos de rollback. Niemiec (2003) nos diz que a pasta de armazenamento é uma área extremamente perigosa para realizar alterações, podendo afetar seriamente seus usuários. Abaixo, a Figura 9 mostra a pasta de armazenamento. 33 Figura 9. Funcionalidades da Pasta de Armazenamento 2.5.2. Oracle SQL Scratchpad Esta ferramenta é de utilidade de desenvolvedores e DBAs. Entre as suas funcionalidades Oferece uma interface ao usuário onde é possível editar e executar instruções SQL. Além destes recursos, a ferramenta ainda possibilita salvar as instruções SQL para uso posterior; carga e salvamento de arquivos de script; suporte a instruções DDL (Data Definition Language) e DML (Data Manipulation Language); exibição do explain plan; e os resultados são ilustrados em formato tabular (MANAGER, 1998). A figura 10 mostra a ferramenta SQL Scratchpad. 34 Figura 10. Ferramenta SQL Scratchpad. O SQL Scratchpad também pode salvar os resultados obtidos em arquivos HTML ou no formato csv. Esta ferramenta está disponível a partir da ferramenta OEM. (MANAGER, 1998). 2.5.3. TOAD A ferramenta TOAD tem com principal funcionalidade o gerenciamento do banco de dados Oracle. Também possui diversas outras funções, como: execução de instruções SQL; explain plan; visualização de esquemas (tabelas, índices); constraints; informações da SGA; entre outras funções. Abaixo, a Figura 11 mostra a ferramenta executando uma instrução SQL. 35 Figura 11. Ferramenta TOAD A ferramenta TOAD também dispõe de um help auxiliando na sua utilização. Como ressalvo, assim como as ferramentas da Oracle, esta ferramenta não é gratuita, necessitando de licença para a sua utilização. 2.6. ESTUDO SOBRE SISTEMAS E PROJETOS SIMILARES Para o desenvolvimento do projeto, inicialmente ocorreram pesquisas em sistemas e projetos similares objetivando estimar o que hoje há de informação sobre o tema deste trabalho de conclusão de curso. Dois projetos foram estudados, sendo esses: • GURU - Uma ferramenta para administrar banco de dados através de Web. (SCHERER, 2002); e • Análise de desempenho do banco de dados Oracle 9i. (FLORES, 2003). Esse estudo propiciou conhecer as dificuldades que DBAs encontram para constatar problemas relacionados a desempenho do banco de dados, assim como a dificuldade em realiar as alterações necessárias para o ajuste. 36 Além disso, através da pesquisa nesses projetos é possível verificar quais parâmetros e quais formas de ajustes de desempenho foram adotadas, para que se possa constatar se realmente esses itens surtem o efeito necessário para melhorar o desempenho do banco de dados. A seguir, esses projetos serão apresentados. 2.6.1. GURU - Uma ferramenta Para Administrar Banco de Dados Através da Web Esta dissertação (mestrado) foi desenvolvida na Universidade Federal do Rio Grande do Sul (UFRGS), tendo como fruto de seu trabalho uma ferramenta para administrar banco de dados através da Web (SCHERER, 2002). Esse trabalho tem como objetivo desenvolver uma ferramenta para auxiliar o DBA a detector e resolver problemas de desempenho de banco de dados. Como principal característica está à utilização da internet como instrumento. Em outras palavras, a ferramenta é Web e o DBA pode utilizar na resolução de problemas a qualquer momento, independente da localização física e lógica do banco de dados. A ferramenta é independente de plataforma. Para tanto foi utilizado a linguagem Java que, dentre suas características, tem a portabilidade que facilita a criação de programas para a internet. Dois SGBDs foram focalizados para a realização do projeto. O primeiro SGBD é o Oracle, que recebeu destaque por ser, segundo a autora, o mais utilizado atualmente. O segundo SGBD que a ferramenta focalize é o SQL Server que também está sendo amplamente utilizado no Mercado, segundo a autora. Como funcionalidades do trabalho, têm-se as seguintes opções de gerenciamento: 2.6.1.1. Gerenciamento de espaço Realizar um controle de armazenamento de objetos e suas informações, de acordo com a autora, é uma prática de grande carga no trabalho do administrador que pode influenciar de forma direta na operação geral do banco de dados. Esse tópico é focado no banco de dados Oracle. Os itens dessa função são: • Maxextents: Identifica o número de extents uitlizados em cada segmento, assim como informar quais segmentos estão se aproximando de sua capacidade máxima; 37 • Tabelas sem espaço: Visualiza uma previsão de tabelas que não têm espaço disponível o suficiente para a próxima gravação do extent em uma tablespace; • Tamanho médio da linha: Com base nesse tamanho médio irão ser baseados os valores para os parâmetros de ocupação do bloco Oracle especificamente, também, o tamanho de espaço livre para os blocos de dados para a sua expansão; • Tamanho máximo da linha: Utilizado em casos de tratamento de encadeamento das linhas que causam uma overhead (estouro do bloco de dados); • Marca D’água: Server para recuperar o espaço não utilizado de uma tabela, sendo que a visualização da marca d’água só é possível após a atualização do dicionário de dados com os valores atualizados; e • Coalesce: Dá ênfase a fragmentação do espaço livre dentro das tablespaces. A fragmentação focalizada é a honeycomb (nessa fragmentação, os extents livres ficam localizados lado a lado). 2.6.1.2. Avaliação de Desempenho Nesse tópico é determinada a disponibilidade do banco de dados. Nessa disponibilidade está o seu desempenho quanto a tempo de resposta. Esse tópico tem como foco o banco de dados Oracle. Os itens dessa funcionalidade são: • System Global Area (SGA): Ponto crítico da memória onde ocorrem as operações da instância, sendo dividida em: o Database buffer cache: Mostra a taxa de hits do buffer de dados, que mede a quantidade de vezes que o Oracle encontrou os blocos de dados que precisava na memória, não necessitando, assim, ler do disco. A ferramenta ainda informa o valor aceitável da taxa de hits e ainda dá dicas de como deve atuar o DBA; e o Shared pool: Essa funcionalidade ainda se divide em dois outros pontos, sendo essas a “library cache” e o “dicionário de dados” sendo que em ambas as opções mostram a taxa de hits, avaliação e dicas; • Area sort: Nessa area são armazenadas consultas SQL que necessitam de cláusulas que necessitam de classificação, como a cláusula order by. O desempenho obtido com esse 38 ajuste, segundo a autora, afeta todo o sistema e não somente quando da necessidade de uma classificação. Essa funão é dividida em três pontos: o Sort memória x sort disco: Conta o número de classificações realizadas em memória e em disco, traçando uma percentagem para classificações. Quando maior a percentagem de classificação em memória, melhor o desempenho do banco de dados. Uma avaliação é realizada pela ferramenta; e o Definição de usuários: Quando ocorre a classificação em disco, há a necessidade que essas sejam realizadas em tablespace temporaries e não permanents. Essa funcionalidade indica os usuários mal definidos que utilizam tablespace permanente; • Armazenamento: Essa funcionalidade envolve três pontos: o Encadeamento de linhas banco de dados: Esse encadeamento ocorre quando uma linha é maior do que o tamanho de um bloco de dados. A interface da ferramenta ilustra o número de linhas encadeadas do banco de dados, assim como uma avaliação e dicas; o Encadeamento de linhas tabelas: Verificado que há linhas encadeadas no banco de dados, então há a necessidade de verificar em quais tabelas há esse encadeamento; e o Extents: De acordo com a autora, há fortes evidências que a redução do crescimento dos extents melhora o desempenho do banco de dados. Essa função mostra o número de extents que determinado objeto ocupa; • SQL: A ferramenta mostra oa DBA quais são as declarações que mais consomem recursos do servidor: o Consumo de disco: Permite ver o número de acesos que determinada declaração fez ao disco, assim como o número de vezes em que foi executada, além do nome do usuário; e o Consumo de CPU: Semelhante ao item anterior, porém, ao invés de indicar o número de acesso a disco, indica o número de leituras feitas na memória; 2.6.1.3. Gerenciamento de schema Permite ver os diferentes tipos de objetos que pertencem os diferentes schemas da instância conectada pela ferramenta. É dividida em três pontos: 39 • Índices: Disponível apenas para Oracle nessa ferramenta, há as opções de listagem, criação e exclusão de indices; • Tabelas: Além do Oracle, também está disponível para o SQL Server e possui, também, as opções de listagem, criação e exclusão de tabelas; e • Visões: Funcionalidade apenas para Oracle, possui as opções de listagem, criação e exclusão de visões. 2.6.1.4. Área de SQL A ferramenta ainda possui uma área para livre execução de comandos SQL, sendo, segundo a autora, imprescindível para administração de um banco de dados, resolvendo, assim, problemas mais complexos ou específicos. De uma forma geral, com esta ferramenta o administrador do banco pode acessar as tabelas do dicionário de dados para identificar e corrigir os problemas que estão afetando a operabilidade do banco de dados. A ferramenta acessa banco de dados em unidades distribuídas separadas física e logicamente umas das outras. A Tabela 2 a seguir ilustra um resumo das vantagens e desvantagens do projeto em resumo: Tabela 2. Quadro de vantagens e desvantagens Vantagens Todos os módulos da ferramenta funcionam através da Web, permitindo acesso em banco de dados de organizações que possuem softwares de seguranças para proteção de sua rede interna, chamados de firewalls. A ferramenta ainda possibilita a utilização de pacotes próprios de criptografia. A ferramenta mantém a sua personalização mesmo com a inclusão de novos módulos. Desvantagens Os módulos da ferramenta não abrangem todos os aspectos dos bancos de dados. Não possui um histórico dos diferentes estados do banco de dados, ao longo de seu acompanhamento. Existe um módulo para executar comandos SQL. Não há resultados mostrados de forma gráfica para facilitar a interpretação dos resultados obtidos na simulação. A ferramenta não é proprietária. É possível acessar bancos de dados de diferentes fornecedores. 40 Em suma, esse projeto alcançou suas metas mostrando que é possível implantar uma ferramenta que possibilite, via internet, a administração de banco de dados, independente da localização física do Administrador do Banco de Dados ou do Bando de Dados. Entre trabalhos futuros a esse, a autora destaca: a inclusão de um módulo para executar backup lógico do banco de dados e permitir que o módulo “Área do SQL” execute programas SQL. 2.6.2. Análise de Desempenho do Banco de Dados Oracle 9i Esta monografia (graduação) foi desenvolvida na Universidade Luterana do Brasil, Campus Canoas (ULBRA), tendo como fruto de seu trabalh uma ferramenta para análise de desempenho do banco de dados Oracle 9i (FLORES, 2003). O objetivo do trabalho é ter uma visão geral do banco de dados Oracle, assim como identificar os parâmetros que envolvem concorrência, desempenho e recuperação de dados. Feito isto, então são utilizadas ferramentas para medir e avaliar o desempenho do banco de dados. Por fim, uma análise dos resultados obtidos é realizada. O projeto consiste em medir o desempenho do banco de dados para consultas e atualizações, conforme os parâmetros de inicialização do Oracle são alterados. Os parâmetros selecionados para ajuste de desempenho nesse projeto são: • DB_BLOCK_BUFFERS: Niemiec (2003) comenta que esse campo é desaconselhável para utilização na versão 9i do Oracle, pois o mesmo desativa muitos recursos dessa versão. Esse parâmetro, de acordo com Myoracle (2004), determina o número de database buffer em um buffer cache; • DB_CACHE_SIZE: Primeiro parâmetro a ser examinado no init.ora e compõe a area da SGA que é usada para armazenar e processor dados da memória. (NIEMIEC, 2003); • DB_FILE_MULTIBLOCK_READ_COUNT: De acordo com Myoracle (2004), esse parâmetro é utilizado para limitar a duração de I/O (entrada e saída) durante a leitura de tabelas. Sendo assim, o DB_FILE_MULTIBLOCK_READ_COUNT especifica o número de blocos lidos em uma operação de I/O; e • GLOBAL_CONTEXT_POOL_SIZE: Especifica o tamanho da memória alocada no SGA para armazenagem e gerenciamento global da aplicação (MYORACLE, 2004); 41 Além desses parâmetros, ainda têm-se: LOCK_SGA; LOG_CHECKPOINT_TIMEOUT; OPTIMIZER_INDEX_CACHING; SORT_AREA_SIZE; SGA_MAX_SIZE; PRE_PAGE_SGA; QUERY_REWRITE_ENABLED; ROW_LOCKING; OPTMIZER_MODE; QUERY_REWRITE_INTEGRITY; OPTIMIZER_MAX_PERMUTATIONS; e OPTIMIZER_INDEX_COST_ADJ. É um aplicativo que roda consultas ou atualizações concorrentemente através do uso de threads. Sendo assim, o aplicativo é executado em um cliente, onde as threads irão similar um sistema multiusuário. São disparados 10 processos que irão realizar consultas e atualizações na base de dados concorrentemente, simulando um sistema multiusuário com 10 clientes conectados ao banco. O aplicativo foi desenvolvido em Delphi. A Tabela 3 a seguir ilustra um resumo das vantagens e desvantagens do projeto em estudo. Tabela 3. Quadro de vantagens e desvantagens Vantagens A medida de desempenho é realizada através de uma simulação, onde irá mostrar o melhor ajuste de desempenho antes da sua aplicação real no banco de dados. Os resultados são mostrados de forma gráfica facilitando, assim, a interpretação dos resultados obtidos na simulação. Desvantagens Poucos parâmetros foram abordados no projeto devido a complexidade e ao tempo necessário para a sua implementação. Não possui um histórico dos diferentes estados do banco de dados, ao longo de seu acompanhamento. Esse trabalho apresentou um estudo sobre os principais parâmetros para ajuste de desempenho do banco de dados Oracle, assim como mostrou ferramentas para o seu manuseio. Por fim, ocorreu a implementação de uma ferramenta que visa ilustrar, de modo gráfico ao administrador do banco de dados, parâmetros específicos através da simulação de resultados, mostrando o que pode ocorrer no bando de dados antes da sua real implantação. 2.7. CONCLUSÕES DA FUNDAMENTAÇÃO TEÓRICA Como conclusão do estudo realizado, se tem como destaque a importância do banco de dados como pioneiro em diversos avanços tecnológicos. Inúmeros foram os avanços que contribuíram para a atual situação em que se encontram os sistemas de gerenciamento de banco de dados que atualmente são utilizados. O estudo continuou mostrando como o SGBD do Oracle trata pontos, como: estrutura física, onde ilustra a organização dos arquivos físicos; estrutura da memória, onde mostra como a memória 42 RAM é dividida e como interagem as diferentes partes da memória com os processos instanciados pelos usuários; estrutura lógica, onde demonstra como o Oracle organiza logicamente os arquivos na memória; e, por fim, a seqüência de UNDO, onde ilustra como são realizadas as operações de acesso e recuperação de dados. Num outro momento, foi definida a conceituação do que é um ajuste de desempenho no banco de dados, para então mostrar como o banco de dados Oracle trabalha com seus parâmetros de ajuste. Finalmente, foram mencionados projetos que também focalizam o ajuste de desempenho em banco de dados servindo como base, juntamente com o restante do estudo, para definir os parâmetros a serem abordados como requisitos desse trabalho. Então, através desses requisitos levantados o presente projeto tem como objetivo desenvolver uma ferramenta que auxilie no ajuste de desempenho do banco de dados Oracle, ilustrando dados estatísticos, gerando scripts para realização da sua manutenção e mantendo um histórico de atuação desta ferramenta. 43 3. PROJETO O projeto proposto nesse trabalho tem como objetivo organizar e gerenciar os dados da ferramenta para análise e ajuste de desempenho do banco de dados Oracle. As etapas que compõem esse capítulo são: • Listagem dos requisitos do projeto; • Visualização do diagrama de contexto com as funções do sistema; e • Visualização, descrição do fluxo de dados e visualização da tela. 3.1. REQUISITOS Os requisitos que o sistema deverá contemplar são: • Função de controle de acesso; • Função para instalação da ferramenta; • Função para visualização da estrutura lógica da memória; • Função para visualização da shared pool; • Função para análise do plano de execução; • Função de análise e reconstrução dos índices da base de dados; • Função para ajuste de esquemas; • Função para consulta de acessos; e • Função para consulta da análise de índices. 3.2. DIAGRAMA DE CONTEXTO O diagrama de contexto representa a relação das entidades com as funções do sistema: 44 Figura 12. Diagrama de Contexto Descrição: • O diagrama de contexto possui as seguintes entidades: o Usuário; e o Banco de Dados. • O diagrama de contexto possui as seguintes funções: o Solicita Acesso ao Banco de Dados; o Solicita Instalação da Ferramenta; o Solicita Visualização da Estrutura da Memória Lógica; o Solicita Visualização da Shared Pool; o Solicita Análise do Plano de Execução; o Solicita Reconstrução de Índices do Banco de Dados; o Solicita Ajuste de Desempenho; 45 o Consulta de Acessos; e o Consulta de Análise de Índices. 3.3. DIAGRAMAS DE FLUXO DE DADOS O fluxo de dados fornece uma visão geral das ações das entidades com determinada função do sistema. 3.3.1. Solicita Acesso ao Banco de Dados Para utilização dessa ferramenta há a necessidade de sua instalação para cada banco de dados a ser realizado o ajuste de desempenho. Usuário Solicita acesso ao banco de dados Acesso ao banco de dados permitido 01 Acesso ao banco de dados Informa dados para acessar banco de dados Grava usuário Usuarios Resposta de acesso ao banco de dados Banco de Dados Figura 13. Solicita Acesso ao Banco de Dados. Descrição: • Essa é a primeira função que o usuário irá acessar ao entrar no sistema, sendo a função de conexão com o banco de dados. 46 • Ao acessar essa função, o usuário irá informar três dados: o Login; o Senha; e o Banco de Dados. • Após o usuário informar os dados, o sistema confirma a conexão com o banco de dados; e • A conexão é registrada na tabela INSTANCIAS. Regras de Negócio • Para cada banco de dados a ser realizado o ajuste de desempenho deve ter a necessidade de instalação da base de dados repositório da ferramenta; • O banco de dados da ferramenta deve estar instalado em um usuário do banco de dados a ser realizado o ajuste de desempenho; • Caso o banco de dados informado não estiver configurado na ferramenta, então a função de configuração do sistema é chamada; • As outras funções do sistema serão disponibilizadas a partir dessa conexão com o banco de dados; • Em caso dos dados de acesso da função não estarem corretos o sistema retorna uma mensagem ao usuário; e • É necessário o usuário que acessou o sistema ter o privilégio de DBA, assim como o usuário no qual está instalada a ferramenta. 47 A Figura 14 referencia a tela da função: Figura 14. Tela do Controle de Acesso ao Banco de Dados. 3.3.2. Solicita Instalação da Ferramenta A ferramenta para ajuste de desempenho é instalada em um dos usuários do banco de dados a ser analisado. 48 Figura 15. Solicita Instalação da Ferramenta Descrição • Ferramenta busca todos os usuários do sistema; • Caso a base de dados da ferramenta já esteja instalada no banco de dados então o usuário tem a opção de desinstalar; e • Caso a base de dados da ferramenta não esteja instalada no banco de dados então o usuário seleciona um schema e esse fica como base para a instalação da ferramenta. Regras de Negócio • Para cada banco de dados a ser analisado é necessário a instalação da ferramenta; e • A ferramenta é instalada somente em um usuário para cada banco de dados. 49 A Figura 16 referencia a tela da função: Figura 16. Tela de Configuração da Ferramenta. 3.3.3. Solicita Visualização da Estrutura Lógica da Memória Função para visualização da estrutura lógica da memória, assim como a sua utilização pelo sistema. 50 Figura 17. Solicita Visualização da Estrutura Lógica da Memória. Descrição • Essa função roda um procedimento que busca as percentagens de utilização da memória lógica, assim como o tamanho que cada item ocupa; • Os dados que o procedimento retorna são os tamanhos e percentagem de utilização das memórias: o Shared Pool; o Database Buffer Cache; o Redo Log Buffer; o Java Pool; e o Large Pool. • As informações são ilustradas de modo gráfico e são atualizadas constantemente; 51 • A ferramenta grava um registro para visualização da estrutura da memória lógica na tabela ACOES; Regras de Negócio • Não possui regras de negócio; A Figura 18 referencia a tela da função: Figura 18. Tela de Visualização da Estrutura Lógica da Memória 3.3.4. Solicita Visualização do Shared Pool Essa função roda um procedimento que busca informações da memória utilizada no Shared Pool. 52 Usuário Solicita visualização da shared pool Visualização da shared pool fornecida 04 Visualiza shared pool Gera comando para visualização da shared pool Resposta a visualização da shared pool Banco de Dados Grava ação Retorna ação Acoes Grava dados dos índices Shared_Pools Figura 19. Solicita Visualização da Shared Pool. Descrição • Os dados que o procedimento retorna são: o Alocação Total do Shared Pool; o Utilização Total do Shared Pool; o Memória Livre; e o Percentagem de Utilização. • As informações são mostradas de forma textual ao usuário; • Também são mostradas ao usuário as últimas consultas realizadas através de um grid; • O sistema grava um registro para análise dos índices na tabela ACOES; e • O sistema também grava as informações dos dados retornados na tabela SHARED_POOLS; 53 Regras de Negócio • Não possui regras de negócio; A Figura 20 referencia a tela da função: Figura 20. Tela de Visualização da Shared Pool 3.3.5. Solicita Análise do Plano de Execução A finalidade inicial dessa função é analisar o plano de execução de um comando SQL. 54 Figura 21. Solicita Análise do Plano de Execução. Descrição • O primeiro passo é o usuário fornecer o script, que pode ser através de um arquivo com extensão .sql ou através de sua escrita na própria tela do sistema. • O sistema grava um registro para a análise do plano de execução na tabela ACOES; e • Cada análise também é registrada na tabela PLANO_EXECUCOES. Regras de Negócio • A sintaxe do comando SQL não é verificada nessa função, cabe ao administrador informar a mesma de maneira correta. 55 A Figura 22 referencia a tela da função: Figura 22. Tela de Análise do Plano de Execução 3.3.6. Solicita Reconstrução de Índices do Banco de Dados Essa função roda um procedimento que busca todos os índices da base de dados, entretanto, o usuário do sistema seleciona um usuário do banco de dados para fazer essa reconstrução de índices; 56 Figura 23. Solicita Reconstrução de Índices do Banco de Dados. Descrição • O procedimento retorna os índices que estão com problemas, sendo esses problemas: o Índices em que estejam acima de certa percentagem de dados já excluídos. Essa percentagem é informada pelo usuário; o Índices em que estejam acima de certa altura de ramos. Essa altura é informada pelo usuário; • Ressalta-se que esses valores podem ser configurados pelo usuário; • Os índices retornados são mostrados num grid pelo sistema; • O sistema grava um registro para análise dos índices na tabela ACOES; • O sistema grava informações dos índices retornados na tabela INDICES; • O usuário pode selecionar os índices retornados no grid e solicitar a sua reconstrução; • O sistema grava um registro para reconstrução dos índices na tabela ACOES; e • O sistema atualiza informações dos índices reconstruídos na tabela INDICES. 57 Regras de Negócio • Não possui regras de negócio; A Figura 24 referencia a tela da função: Figura 24. Tela de Reconstrução de Índices 3.3.7. Solicita Ajuste de Esquemas Esse é uma função inicial para execução de ajustes de esquemas, tendo como finalidade direcionar as opções de ajustes. 58 Usuário Seleciona Ação Opção de Ajuste Selecionada 07 Solicita Ajuste de Esquemas Figura 25. Solicita Ajuste de Esquemas. Descrição • As opções para ajustes de esquemas são os seguintes: o Ajuste de Tabelas; e o Ajuste de Índices; • Para cada tipo de ajuste é chamada duas sub-funções, sendo uma para visualização e outra para criação. Regras de Negócio • Não possui regras de negócio; 59 A Figura 26 referencia a tela da função: Figura 26. Tela de Ajustes de Esquemas 3.3.7.1. Visualização de Tabelas A finalidade dessa função é visualizar todas as tabelas de determinado usuário da base de dados. Figura 27. Visualização de Tabelas. 60 Descrição • O usuário primeiro define qual usuário do banco de dados que serão visualizadas as tabelas; • Após a seleção do usuário então é visualizado as tabelas, onde o usuário da ferramenta ainda pode obter as seguintes informações: o Colunas; o Índices; e o Número de Registros. Regras de Negócio • Não possui regras de negócio; A Figura 28 referencia a tela da função: Figura 28. Tela de Visualização de Tabelas 61 3.3.7.2. Criação de Tabelas A finalidade dessa função é criar tabelas de determinado usuário na base de dados. Figura 29. Criação de Tabelas. Descrição • Como primeiro passo o usuário seleciona o usuário do banco de dados onde irá ser criado a tabela e informa o seu nome; • Após, o usuário informa as colunas desta tabela; • Criada a tabela, então o usuário ainda informa a chave primária; • O sistema grava um registro para criação de tabela na tabela ACOES; e • As informações da tabela criada são registradas na tabela ESQUEMAS; Regras de Negócio • A ferramenta verifica se tabela já existe para o usuário selecionado na base de dados; 62 A Figura 30 referencia a tela da função: Figura 30. Tela de Criação de Tabelas 3.3.7.3. Visualização de Índices A finalidade dessa função é visualizar todos os índices de determinado usuário da base de dados. 63 Figura 31. Visualização de Índices. Descrição • O primeiro passo é selecionar o usuário em que está a tabela a ser visualizado o índice; • Com a seleção do usuário, o próximo passo é selecionar a tabela para visualização de seus respectivos indices; • Após a visualização dos índices, o usuário pode selecionar um desses e visualizar as seguintes informações: o Número de registros; o Número de registros válidos; e o Número de registros apagados; Regras de Negócio • Não possui regras de negócio; 64 A Figura 32 referencia a tela da função: Figura 32. Tela de Visualização de Tabelas 3.3.7.4. Criação de Índices A finalidade dessa função é criar tabelas de determinado usuário na base de dados. 65 Figura 33. Criação de Índices. Descrição • O primeiro passo é a seleção de um usuário para então selecionar a tabela a ser inserido o índice; • Entre as informações necessárias à criação de um índice está: o Nome do Índice; o Nome da Tabela; e o Tipo do Índice; • O sistema grava um registro para criação de tabela na tabela ACOES; e • As informações do índice criado são registradas na tabela ESQUEMAS; Regras de Negócio • Verifica se nome do índice já existe; 66 A Figura 34 referencia a tela da função: Figura 34. Tela de Criação de Tabelas 67 3.3.8. Solicita Consulta de Acessos ao Banco de Dados Consulta acesso ao banco de dados Usuário 08 Consulta acessos ao banco de dados Consulta acessos Retorna ações Consulta ações Retorna acessos Usuarios Acoes Figura 35. Consulta de Acessos ao Banco de Dados. Descrição • A finalidade é mostrar as datas de acessos ao banco de dados através da ferramenta; • Entre as informações como filtros estão as datas de acesso, delimitando um período; e • Após, o usuário pode selecionar um acesso ao banco de dados e ver as ações que o usuário realizou; Regras de Negócio • A consulta se restringe ao usuário e a base de dados em que o sistema está conectado; 68 A Figura 36 referencia a tela da função: Figura 36. Tela de Consulta de Acessos 69 3.3.9. Solicita Consulta de Análise de Índices Usuário Banco de Dados Resposta a reconstrução de índices Consulta reconstrução de índices Reconstrução de índices consultada Grava ação 08 Consulta Análise de índices Comando para reconstrução dos índices Retorna usuário Retorna ação Retorna índices Grava índices Consulta índices Acoes Indices Usuarios Figura 37. Consulta de Análise de Índices Descrição • Essa função roda um procedimento que busca todos os índices de determinado usuário da base de dados já analisadas e reconstruídos; Regras de Negócio • Não possui regras de negócio. 70 A Figura 38 referencia a tela da função: Figura 38. Tela de Consulta de Índices Reconstruídos 3.4. MODELAGEM ENTIDADE RELACIONAMENTO A Tabela 4 mostra a descrição das tabelas que serão utilizadas no sistema. Já o Dicionário de Dados é visualizado no Apêndice A dessa monografia. Tabela 4. Descrição das tabelas utilizadas no sistema Nome da tabela ACOES ESQUEMAS INDICES MEMORIA_LOGICAS PLANO_EXECUCOES SHARED_POOLS USUARIOS Descrição Tabela para registro das ações do usuário no sistema. Tabela para registro das atividades em ajuste de esquemas. Tabela para registro dos índices analisados e reconstruídos. Tabela para registro da visualização das memórias lógicas. Tabela para registro das análises do plano de execução. Tabela para registro da visualização da shared pool. Tabela para registro de acesso do usuário no banco de dados. A Figura 39 expõe o diagrama ER, mostrando o relacionamento entre as tabelas do sistema Diversas outras atividades podem ser incorporadas em projetos futuros, ente elas: • Desenvolvimento de novas funcionalidades, como desfragmentação de tabelas; 71 • Agendamento de tarefas para execução das funcionalidades, independente ou não da presença do DBA; • Desenvolvimento de ferramentas de tuning para banco de dados free ou opensource; e • Incluir um outro banco de dados nesta ferramenta. INDICES CD_ACAO: NUMBER(6) CD_INSTANCIA: NUMBER(6) CD_INDICE: INTEGER NOME: VARCHAR2(100) ALTURA: INTEGER NR_LINHAS: INTEGER NR_APAGADAS: INTEGER PERCENTAGEM: NUMBER(4,2) COMANDO: VARCHAR2(200) ID_STATUS: CHAR(1) DT_STATUS: DATE INSTANCIAS CD_INSTANCIA: NUMBER(6) LOGIN: VARCHAR(20) BASE_DADOS: VARCHAR(20) DT_ACESSO: DATE DT_FINALIZACAO: DATE PLANO_EXECUCOES CD_PLANO_EXECUCOES: NUMBER(6) CD_INSTANCIA: NUMBER(6) CD_ACAO: NUMBER(6) ANALISE: VARCHAR2(100) DT_ANALISE: DATE ACOES CD_ACAO: NUMBER(6) CD_INSTANCIA: NUMBER(6) DT_ACAO: DATE ID_ACAO: CHAR(2) SHARED_POOLS CD_INSTANCIA: NUMBER(6) CD_ACAO: NUMBER(6) CD_SHARED_POOL: NUMBER(6) TAMANHO_TOTAL: NUMBER(12) TAMANHO_UTILIZADO: NUMBER(12) TAMANHO_LIVRE: NUMBER(12) PERCENTAGEM_UTILIZADA: NUMBER(4,2) DT_VISUALIZACAO: DATE DICIONARIO_CACHE: NUMBER(4,2) BIBLIOTECA_CACHE: NUMBER(4,2) MEMORIA_LOGICAS CD_ACAO: NUMBER(6) CD_INSTANCIA: NUMBER(6) CD_MEMORIA: NUMBER(6) TM_SHARED_POOL: NUMBER(12) TM_DATABASE: NUMBER(12) TM_REDO_LOG: NUMBER(12) TM_JAVA_POOL: NUMBER(12) TM_LARGE_POOL: NUMBER(12) PC_SHARED_POOL: NUMBER(4,2) PC_DATABASE: NUMBER(4,2) PC_REDO_LOG: NUMBER(4,2) PC_JAVA_POOL: NUMBER(4,2) PC_LARGE_POOL: NUMBER(4,2) DT_ATUALIZACAO: DATE ESQUEMAS CD_ESQUEMA: NUMBER(6) CD_INSTANCIA: NUMBER(6) CD_ACAO: NUMBER(6) NOME_ESQUEMA: VARCHAR2(100) ID_ESQUEMA: CHAR(1) Figura 39. Diagrama de Entidade/Relacionamento 3.5. FERRAMENTAS UTILIZADAS Para desenvolvimento do presente projeto foram utilizadas as ferramentas: Delphi versão 7.0, para implentação das telas e conexão com o banco de dados Oracle; e, para a modelagem do banco de dados foi utilizado ERwin versão 4.0. Além dessas ferramentas também foi utilizado a ferramenta SQL Plus versão 9.2.0.1.0, da Oracle, assim como o Oracle Enterprise Manager versão 9.2.0.1.0. 72 4. VALIDAÇÃO Este capítulo tem como finalidade apresentar a validação das funções do projeto, mostrando que os resultados obtidos estão de acordo com a realidade do banco de dados em pauta no projeto. 4.1. ESTRUTURA LÓGICA DA MEMÓRIA Esta função tem como objetivo mostrar a utilização da partes da memória utilizada pelo Oracle. Entre estas partes que consistem esta estrutura, Cyran (2002) cita: Shared Pool; Database Buffer Cache; Redo Log Buffer; e Large Pool. Além dessas partes da memória, ainda é analisado a Java Pool. 4.1.1. Shared Pool De acordo com Green (2002), na inicialização do sistema alguns paramêtros necessitam ser inicializados, entre eles está o shared_pool_size, que representa o tamanho da shared pool no SGA. Este atributo pode ser visualizado através do comando abaixo descricto, conforme relata Plummer (2004): select pa.Value into pool_size from V$PARAMETER pa where pa.Name='shared_pool_size'; Para saber o quanto está sendo utilizado da shared pool, Kiltrack (2001) explica que são necessários três passos: • Para visualizar objetos armazenados como packages e views: select sum(sharable_mem) from v$db_object_cache where type = 'PACKAGE' and type = 'PACKAGE BODY' and type = 'FUNCTION' and type = 'PROCEDURE' • Para visualizar a utilização de memória por SQL, o mesmo autor conta que é necessário que as instruções SQL sejam utilizadas algumas vezes para então ocupar espaço na memória, ficando assim a instrução: select sum(sharable_mem) as memoria_shared_sql from V$SQLAREA where executions > 5 • Por fim, o autor ainda destaca que devem ser consideradas um total de 250 bytes por cursor aberto utilizado por cada usuário: select sum(250*users_opening) as memoria_cursor from V$SQLAREA 4.1.2. Database Buffer Cache Green (2002) diz que o parâmetro de inicialização do tamanho do database buffer cache é o db_buffer_cache. Plummer (2004) dá o seguinte script para busca desta informação: select Value as db_buffer_cache_size from V$PARAMETER where Name = 'db_cache_size' Para se ter o percentual de utilização do database buffer cache, Kiltrack (2001) dá dois parâmetros para consulta, tendo os scripts abaixo escritos: select value as db_keep_cache_size from V$PARAMETER where name = 'db_keep_cache_size' select Value as db_recycle_cache_size from V$PARAMETER where Name = 'db_recycle_cache_size' 4.1.3. Redo Log Buffer De acordo com Zegger (2001), o tamanho mínimo para o Redo Log Buffer é de 64Kb e o parâmetro para obtenção está abaixo descrito: select Value as log_buffer from V$PARAMETER where Name = 'log_buffer' Kiltrack (2001) cita que para buscar a utilização dessa memória é necessária a utilização de deste scritp: SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'redo buffer allocation retries' UNION SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'redo entries' 4.1.4. Java Pool O parâmetro para visualização do tamanho do java pool é o java_pool_size. É este parâmetro que é ajustado se estiver sendo utilizados procedimentos de armazenamento em java. O script abaixo mostra como obter essa informação. (Green, 2002). select Value as java_pool 74 from V$PARAMETER where Name = 'java_pool_size' Maring (2002) cita que o comando para saber a utilização do java pool é: SELECT BYTES FROM V$SGASTAT WHERE POOL = 'java pool' AND NAME = 'memory in use'; 4.1.5. Large Pool Conforme Cyran (2002), o large pool é uma área opcional para alocação de memória do Oracle para realização de backup e restore, para processos de I/O e, também, para sessão de usuários. O comando para ver o tamanho dessa memória é este: select Value as large_pool from V$PARAMETER where Name = 'large_pool_size' Para obter o quanto de memória livre ainda tem do larte pool, o comando necessário, de acordo com Maring (2002), está abaixo descrito. Assim, basta subtrair o valor da memória total alocado pela memória livre para saber o quanto está sendo utilizado a memória large pool. SELECT BYTES FROM V$SGASTAT WHERE POOL = 'large pool' AND NAME = 'free memory'; 4.2. VISUALIZAÇÃO DA SHARED POOL Além das partes apresentadas na função Estrutura Lógica da Memória, ainda restam mais duas partes, a dictionary cache (mantêm informações do dicionário de objetos) e library cache (armazena informações da shared pool e PL/SQL). (KILPATRICK. 2001). Então, esta função tem como finalidade mostrar informações da shared pool, assim como obter informações de utilização das partes anteriormente citadas. 4.2.1. Shared Pool Para esta parte da memória o que se buscou foi o total alocado, o quanto de sua utilização, o quanto de memória livre e o percentual de utilização. Os scripts para obtenção desses dados estão baseados de acordo com o tópico 4.1.1. 4.2.2. Dictionary Cache 75 Green (2002) diz que as informações armazenadas na dictionary cache se refere a informações de usuários, segmentos, tablespace, schema de objetos, entre outras informações. O script para conseguir o percentual de sua utilização está descrito a seguir: SELECT ROUND(SUM(GETS)/(SUM(GETS)+SUM(GETMISSES)) * 100,2) DICTIONARY_USED FROM V$ROWCACHE; 4.2.3. Library Cache Segundo Green (2002), quando uma aplicação é executada, o Oracle busca na library cache o seu comando para realizar uma reutilização. O comando a seguir descreve o percentual de utilização desta parte da memória. SELECT ROUND(SUM(PINHITS)/SUM(PINS) * 100,2) AS LIBRARY_USED FROM V$LIBRARYCACHE 4.3. RECONSTRUÇÃO DE ÍNDICES Evoltion (2005) relata que se recria um índice para comprimi-lo e minimizar o espaço fragmentado, ou para mudar as características de armazenamento do índice. Lorentz (2002) diz que o primeiro é recolher informações estatísticas para analisar como está o índice. O comando para esta visualização é o ANALYZE INDEX... ...VALIDATE STRUCTURE. A partir deste comando o usuário da ferramenta pode avaliar que índices devem ser reconstruídos filtrando através dos campos HEIGHT (altura do índice) e DEL_LF_ROWS (número de registros apagados do índice). (LORENTZ, 2002). Por fim, para reconstrução do índice, Evoltion (2005) destaca o comando ALTER INDEX... ...REBUILD. Através deste comando REBUILD o Oracle utiliza o índice anterior para construir o novo. 4.4. PLANO DE EXECUÇÃO O Explain Plan determina o plano de execução de um comando específico de SQL. Este plano de execução descreve uma fileira de cada acesso em uma tabela especificada. A partir deste comando “EXPLAIN PLAN SET STATEMENT_ID variavel FOR comando_sql” o plano de execução fica numa tabela temporária chamada PLAN_TABLE. (LORENTZ, 2002) 76 Com este armazenamento temporário então é possível visualizar os acessos utilizados para a execução do comando SQL. A seguir está exposto um exemplo deste comando, segundo Lorentz (2002). • Passo inicial, onde o Explain Plan analisa o comando SQL: EXPLAIN PLAN SET STATEMENT_ID = ’Raise in Tokyo’ INTO plan_table FOR UPDATE employees SET salary = salary * 1.10 WHERE department_id = (SELECT department_id FROM departments WHERE location_id = 1200); • Comando visualização dos acessos as tabelas pelo comando SQL obtidas através do Explain Plan: SELECT LPAD(’ ’,2*(LEVEL-1))||operation operation, options, object_name, position FROM plan_table START WITH id = 0 AND statement_id = ’Raise in Tokyo’ CONNECT BY PRIOR id = parent_id AND statement_id = ’Raise in Tokyo’; • Visualização dos acessos: OPERATION -----------------UPDATE UPDATE TABLE ACCESS VIEW HASH JOIN INDEX INDEX OPTIONS ----------------- OBJECT_NAME --------------STATEMENT EMPLOYEES EMPLOYEES index$_join$_00 FULL RANGE SCAN FAST FULL SCAN DEPT_LOCATION_I DEPT_ID_PK POSITION ---------2 1 1 1 1 1 2 4.5. AJUSTE DE ESQUEMAS Esta função é dividida em quatro partes: Visualização das Tabelas, Criação de Tabelas, Visualização de Índices e Criação de Índices. 4.5.1. Visualização de Tabelas O que tem de comum entre as 04 partes desta função é a seleção de um usuário da base de dados para a sua execução. Esta seleção é realizada através da view SYS.USER$. A partir da seleção de um usuário são visualizadas as suas respectivas tabelas através da tabela dba_tables. O ultimo passo é realizar uma busca de informações pertinentes a esta tabela, envolvendo: colunas; indices, com suas respectivas colunas; e o número de registros válidos da tabela. 77 4.5.2. Criação de Tabelas Lorentz (2002) diz que através do comando CREATE TABLE podem ser criadas tabelas relacionais onde, inicialmente, vem sem nenhum dado de informação e podem ser preenchidas através do comando INSERT. Após a criação ainda é possível incluir novas colunas, partições e CONSTRAINTS - alvo desta função. Os tipos de campos utilizados para a criação de uma tabela foram retirados de Erwin (2001) e estão de acordo com Lorentz (2002). A função também solicita a criação de uma chave primária e a possibilidade de criação de constraints, onde os seus scripts de criação estão de acordo com Erwin (2001). 4.5.3. Visualização de Índices Para a visualização é novamente utilizado o comando “ANALYZE INDEX... ...VALIDATE STRUCTURE”, utilizado pela função de reconstrução de índices, segundo Lorentz (2002). Juntamente com dados estatísticos deste comando, também são mostrados dados dos índices, envolvendo as tabelas que pertencem e suas respectivas colunas. 4.5.4. Criação de Índices A criação de índices, assim como a criação de chave primária de constraints, descrita no tópico 4.5.2, também segue os scripts gerados pelaa ferramenta Erwin 4.0, estando também de acordo com Lorentz (2002). 4.6. COMPARATIVO ENTRE PROJETOS ESTUDADOS E PROJETO IMPLEMENTADO Em relação aos projetos estudados no tópico 2.6 da fundamentação teórica, vantagens e desvantagens podem ser destacadas, onde a Tabela 5 vislumbra essas diferenças e semelhanças. Tabela 5. Tabela de vantagens e desvantagens entre ferramentas Projeto Guru Uma Análise de desempenho do Ferramenta ferramenta para administrar banco de dados Oracle 9i. projeto. banco de dados através de Web 78 foco deste Ferramenta Web, permitindo acesso em banco de dados de organizações que possuem softwares de seguranças para proteção de sua rede interna, chamados de firewalls. Existe um módulo para executar comandos SQL. Ferramenta desktop, permitindo Ferramenta desktop, permitindo acesso em banco de dados acesso em banco de dados apenas através da intranet. apenas através da intranet. Não possui módulo para executar comandos SQL. Não executa comandos SQL, mas sim mostra o seu plano de execução. A ferramenta não é proprietária. A ferramenta não é proprietária. A ferramenta não é proprietária. É possível acessar bancos de Somente para o banco de dados Somente para o banco de dados dados de diferentes Oracle. Oracle. fornecedores. Não possui um histórico dos Não possui um histórico dos Possui um histórico de ações diferentes estados do banco de diferentes estados do banco de realizadas pela ferramenta. dados, ao longo de seu dados, ao longo de seu acompanhamento. acompanhamento. Não há resultados mostrados de Os resultados são mostrados de Os resultados são mostrados de forma gráfica para facilitar a forma gráfica facilitando, assim, forma gráfica e através de grids. interpretação dos resultados a interpretação dos resultados obtidos na simulação. obtidos na simulação. Os módulos da ferramenta Os módulos da ferramenta não Os módulos da ferramenta abrangem diferentes aspectos abrangem todos os aspectos do abrangem diferentes aspectos do banco de dados, porém, nem banco de dados. do banco de dados, porém, nem todos. todos. Há a possibilidade de análise A medida de desempenho é Há a possibilidade de análise antes da realização ou não do realizada através de uma antes da realização ou não do ajuste de desempenho de alguns simulação, onde irá mostrar o ajuste de desempenho de alguns módulos. melhor ajuste de desempenho módulos. antes da sua aplicação real no banco de dados. Os três projetos abordaram poucos parâmetros para ajuste de desempenho. Isso se dá devido a complexidade e ao tempo necessário para a sua implementação. Ressalta-se que estes projetos não tem como foco principal a implementação de uma ferramenta e sim realizar um estudo sobre esta ajuste de desempenho. 79 5. CONCLUSÕES O presente projeto teve como principal objetivo realizar um estudo sobre ajuste de desempenho do banco de dados Oracle e, a partir deste estudo, selecionar parâmetros e/ou funções para serem utilizados como funcionalidades no desenvolvimento de uma ferramenta para análise e/ou ajuste de desempenho deste banco. Durante a revisão bibliográfica foi determinado que a versão do banco de dados Oracle foco deste projeto era a 9i, devido a disponibilidade de materiais e também por que a versão mais recente, 10g, havia sido recém lançada no início dos estudos. A fundamentação teórica se deu através do funcionamento do SGBD Oracle; do conceito de ajuste de desempenho; de como o Oracle proporciona este ajuste de desempenho; de estudo de ferramentas que realizam ajuste de desempenho; e, por fim, de projetos similares a este desenvolvido. A ferramenta desenvolvida durante o projeto não tem uma finalidade comercial, assim como também não visa a sua utilização por um DBA experiente em um banco de dados em modo de produção. Este ferramenta tem sim, como finalidade, a confirmação dos conceitos levantados durante o projeto. Como ferramenta de desenvolvimento adotou-se o Delphi, versão 7.0, utilizando como forma de comunicação com o banco de dados, componentes da palheta dbExpress. Não foi utilizado nenhuma API Windows, tornando capaz a sua implementação via web, porém a sua utilização é desktop. Entre as funções da ferramenta está a visualização da estrutura lógica da memória, mostrando o tamanho e a porcentagem de utilização dos parâmetros: Shared Pool; Database Buffer Cache; Redo Log Buffer; Java Pool; e Large Pool. Outra função desenvolvida é a da visualização da Shared Pool, acresentando-se aos parâmetros apresentados a utilização do dictionary cache e da library cache. Essas funções podem ser ampliadas futuramente com um estudo e desenvolvimento de algoritmos para reajuste do tamanho da memória com o objetivo de se obter um melhor desempenho. 80 A reconstrução de índices também foi abordada no projeto, através da análise dos índices, verificando informações de altura e porcentagem de registros apagados, e sua reconstrução. Esta função pode ser ainda melhorada através da visualização de como estava o índice antes de ser reconstruído com o próprio índice após a sua reconstrução. A função de ajuste de esquemas está dividida em quatro partes: visualização de tabelas, onde são mostrados informações de colunas, índices e registros; criação de tabelas, onde são incluídas colunas, partições e constraints; visualização de índices, mostrando a situação de determinado índice; e, por fim, a criação de índice. Por fim, a ferramenta tem duas funções que mostram o histórico de utilização da ferramenta, sendo: consulta de acessos, mostrando que funções foram utilizadas; e consulta de índices reconstruídos, mostrando quando determinado índice foi reconstruído e qual o seu estado naquele instante. Muitas idéias podem ser incorporadas em futuros projetos, entre elas: • Desenvolvimento de novas funcionalidades, como: Desfragmentação de tabelas. Para tanto, há a necessidade de um estudo sobre tablespace; Incorporar ao explain plan um estudo outras ferramentas e instrumentos de diagnóstico do Oracle, como o Sql Trace e o Tkprof; • Agendamento de tarefas para execução das funcionalidades, independente ou não da presença do DBA; • Um estudo comparativo do banco de dados Oracle com bancos de dados free ou opensource; • Adaptação da ferramenta ao banco de dados Oracle 10g; • Inclusão de help, de dicas de ajustes e informações referentes ao estudo desenvolvido na fundamentação teórica na ferramenta; • Desenvolvimento de ferramentas de tuning para banco de dados free ou opensource; e • Incluir um outro banco de dados nesta ferramenta. 81 Cabe salientar que o tópico ajuste de desempenho não é um assunto trivial na área de banco de dados, e dificilmente é abordado nas disciplinas de graduação em Ciência da Computação, sendo o primeiro trabalho de conclusão de curso desta universidade a tratar do tema. Desta forma acreditase que o mesmo pode contribuir de forma relevante para o desenvolvimento de trabalhos futuros. O seu objetivo geral foi atingido, porém, quanto a validação da ferramenta sugere-se que seja mais explorado com a utilização de um banco de dados em produção de grande porte, o que não possível por questão de prazos. Por fim, acredita-se que através de todo estudo apresentado e da ampliação do projeto através das idéias aqui expostas para aperfeiçoamento da ferramenta, possa-se utilizar a ferramenta para fins didáticos, auxiliando estudantes e/ou profissionais da área de informática no estudo introdutório do ajuste de desempenho de banco de dados. 82 REFERÊNCIAS BIBLIOGRÁFICAS CYRAN, M. Database Concepts, Release 2 (9.2): Part Nº A96524-01. 2002. Disponível em :< http://ocpdba.net/9idoc/server.920/a96524.pdf>. 01 jun. 2005. DATE, C. J. Introdução a sistemas de bancos de dados. 7ª ed. Rio de Janeiro: Campus, 2000. ERWIN: Erwin. Versão 4.0: Copyright (c). Computer Associates Internacional, Inc. 2001. EVOLTION: Oracle 9i Database Performance Guide and Reference. 2005. Disponível em: < http://www.evolition.com.au/documents/oracle_indexes_and_clusters.pdf>. Acesso em 01 jun. 2005. FANDERUFF, D. Dominando o Oracle 9i: modelagem e desenvolvimento. São Paulo: Pearson, 2003. FLORES, F. M. Análise do desempenho do banco de dados Oracle 9i. 2003. 71 f. Monografia (Graduação) – Curso de Ciência da Computação, Universidade Luterana do Brasil, Canoas, 2003. GREEN, C. D. Oracle9i Database Performance Tuning Guide and Reference, Release 2 (9.2): Part Nº A96533-02. 2002. Disponível em :< http://www.stanford.edu/dept/itss/docs/oracle/9i/server.920/a96533/>. 01 jun. 2005. KILPATRICK, P.; RAMAN, S.; WOMACK, J. Oracle9i Performance Tuning: Studente Guide. Volume 1. 2001. Disponível em: < http://occonline.occ.cccd.edu/online/gfernandez/PerfTunvol1.pdf>. 01 jun. 2005. LORENTZ, D. Oracle9i SQL Reference, Release 2 (9.2): Part Nº A96540-02. 2002. Disponível em :< www.cs.umb.edu/cs634/ora9idocs/server.920/a96540 />. 01 jun. 2005. MANAGER: Oracle (R) Enterprise. Versão 9.2.0.1.0: Produção Copyright (c). Oracle Corporation 2002. MARING, S. Oracle9i Java Developer’s Guide, Release 2 (9.2): Part Nº A96656-01. 2002. Disponível em :< http://www.lc.leidenuniv.nl/awcourse/oracle/java.920/a96656.pdf >. 01 jun. 2005. MYORACLE: Oracle 9i Database Reference. 2004. Disponível em: <http://my.oracle.com>. Acesso em 29 out. 2004. NIEMIEC, R. J. Oracle 9i performance tuning: dicas e técnicas. Rio de Janeiro: Campus, 2003. ORACLE: A história da Oracle. 2004. Disponível em: <http://www.oracle.com/lang/pt/corporate/story.html>. Acesso em: 12 set. 2004. PEASLAND, B. Knowing When To Rebuild Indexes. Eros Data Center 2000. Disponível em :< http://www.quest-pipelines.com/newsletter-v2/rebuild.htm>. 01 set. 2004. PLUMMER, G. Playing in the Shared Pool Without a Lifeguard. 2004. Disponível em: < http://www.profissionaloracle.com.br>. 14 out. 2004a. RAMALHO, J. A. Oracle. São Paulo: Berkeley Brasil, 1999. SCHERER, A. P. Z. GURU - Uma ferramenta para administrar banco de dados através da Web. 2002. 88 f. Dissertação (Mestrado) – Programa de Pós-Graduação em Computação, Universidade Federal do Rio Grande do Sul, Porto Alegre, 2002. SENEGACNIK, J. Database Tuning For Beginners. 2004. Disponível em: < http://www.profissionaloracle.com.br>. 14 out. 2004a. SENEGACNIK, J. How to Tune an Application. 2004. Disponível em: < http://www.profissionaloracle.com.br>. 14 out. 2004b. SILBERSCHATZ, A; KORTH, H. F. Sistemas de banco de dados. São Paulo: Makron, 1999. TOAD VI: The Tool for Oracle Application Developers. Version 6.3.11.1 g: Quest Software. Disponível em: <http://www.toadsoft.com/toadfree.zip>. Acesso em: 01 mai 2005. URMAN, S. Programação em Oracle PL/SQL. Lisboa. McGraw-Hill: 1999. ZEGGER, C. Demystifying and tunnig oracle memory allocation. 2001. Disponível em: http://www.oracleassist.com. 12 out. 2004. 84 APÊNDICE A – MODELAGEM DE DADOS Tabela 6. Dicionário de dados da tabela acoes Nome do atributo cd_instancia Tipo Number(6) cd_acao dt_acao id_acao Number(6) Date Char(1) Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Código seqüêncial gerado pelo banco de dados utilizado na tabela ACOES. Data em que ocorreu a ação. Identifica o tipo da ação do usuário. 01 - Reconstrução de índice 02 - Visualização da Shared Pool 03 - Visualização da Estrutura da Memória Lógica 04 - Visualização das Tabelas 05 - Criação de Tabelas 06 - Visualização dos Índices 07 - Criação de Índices 08 - Análise do Plano de Execução Tabela 7. Dicionário de dados da tabela esquemas Nome do atributo cd_instancia Tipo Number(6) cd_acao cd_esquema Number(6) Number(6) nome_esquema id_esquema Varchar2(50) Char(1) Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Código seqüêncial gerado pelo banco de dados utilizado na tabela ACOES. Código seqüêncial gerado pelo banco de dados utilizado na tabela ESQUEMAS. Nome do esquema. Identifica o tipo de esquema: 1 - Cria Tabela 2 - Cria Visão Tabela 8. Dicionário de dados da tabela indices Nome do atributo cd_instancia Tipo Number(6) cd_acao cd_indice Number(6) Number(6) Nome Altura nr_linhas nr_apagadas Percentagem Comando id_status Varchar2(50) Number(1) Number(7) Number(7) Number(4,2) Varchar2(100) Char(1) dt_status Date Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Código seqüêncial gerado pelo banco de dados utilizado na tabela ACOES. Código seqüêncial gerado pelo banco de dados utilizado na tabela INDICES. Nome do índice. Altura do índice. Número de linhas do índice. Número de linhas apagadas no índice. Percentagem de número de linhas apagadas no índice. Comando para reconstrução do índice. Identifica o estado do índice, pode ser: 1 - Analisado 2 - Reconstruído. Data do status. Tabela 9. Dicionário de dados da tabela instancias Nome do atributo cd_instancia Tipo Number(6) Login Varchar2(20) Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Login do usuário. base_dados dt_acesso Varchar2(20) Date Nome da base de dados. Data de acesso. Tabela 10. Dicionário de dados da tabela memoria_logicas Nome do atributo cd_instancia Tipo Number(6) cd_acao cd_memoria Number(6) Number(6) tm_shared_pool tm_database tm_redo_log tm_java_pool tm_large_pool pc_shared_pool pc_database pc_redo_log pc_java_pool pc_large_pool dt_atualizacao Number(12) Number(12) Number(12) Number(12) Number(12) Number(4,2) Number(4,2) Number(4,2) Number(4,2) Number(4,2) Date Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Código seqüêncial gerado pelo banco de dados utilizado na tabela ACOES. Código seqüêncial gerado pelo banco de dados utilizado na tabela MEMORIA_LOGICAS. Tamanho da shared pool. Tamanho da database buffer cache. Tamanho da redo buffer log. Tamanho da java pool. Tamanho da large pool. Percentagem de utilização da shared pool. Percentagem de utilização da database buffer cache. Percentagem de utilização da redo buffer log. Percentagem de utilização da java pool. Percentagem de utilização da large pool. Data de visualização da memória. Tabela 11. Dicionário de dados da tabela plano_execucoes Nome do atributo cd_instancia Tipo Number(6) cd_acao Number(6) cd_plano_execucoes Number(6) Analise dt_analise Varchar2(100) Date Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Código seqüêncial gerado pelo banco de dados utilizado na tabela ACOES. Código seqüêncial gerado pelo banco de dados utilizado na tabela PLANO_EXECUCOES. Análise do plano de execução. Data da análise. Tabela 12. Dicionário de dados da tabela shared_pools Nome do atributo cd_instancia Tipo Number(6) cd_acao Number(6) cd_shared_pool Number(6) tamanho_total tamanho_utilizado tamanho_livre Percentagem_utilizada dt_visualizacao dicionario_cache biblioteca_cache Number(12) Number(12) Number(12) Number(4,2) Date Number(4,2) Number(4,2) Descrição Código seqüêncial gerado pelo banco de dados utilizado na tabela INSTANCIAS. Código seqüêncial gerado pelo banco de dados utilizado na tabela ACOES. Código seqüêncial gerado pelo banco de dados utilizado na tabela SHARED_POOLS. Espaço total alocado pra shared pool. Espaço utilizado da shared pool. Espaço livre da shared pool. Percentagem utilizada da shared pool. Data de visualização da shared pool. Percentagem utilizada do dicionário cache. Percentagem utilizada da biblioteca cache. 86 APÊNDICE B – ESPECIFICAÇÃO DAS FUNÇÕES Especificação de Acesso ao Banco de Dados Fluxo de Execução: Não possui fluxo de execução Eventos dos Componentes Botão Conectar OnClick Conecta a ferramenta em um banco de dados. //campos obrigatórios para conexão Se Edit Login.Texto == Null Então Gerar Mensagem(‘Preencher o campo Login’); Edit Login = Focalizado; Break(); Fim Se Se Edit Senha.Texto == Null Então Gerar Mensagem(‘Preencher o campo Senha’); Edit Senha = Focalizado; Break(); Fim Se Se Edit Base de Dados.Texto == Null Então Gerar Mensagem(‘Preencher o campo Base de Dados’); Edit Base de Dados = Focalizado; Break(); Fim Se //conectando ao banco de dados Execute = ‘Connect ‘ + Edit Login.Texto + ‘/’ + Edit Senha.Texto + ‘@’ + Edit Base de Dados.Texto + ‘;’; Se Execute == Falso Então Gerar Mensagem(‘Conexão não Realizada. Verifique seus dados de entrada.’); Edit Login = Focalizado; Break(); Fim Se Se Execute == Verdadeiro Então //verifica se banco de dados está configurado no sistema. Configura = falso; Abre configuracao.sql; Enquanto não final do arquivo Faça Se linha do arquivo == Edit Base de Dados.Texto Então Configurado = verdadeiro; Sai do laço; Fim Se Fim Enquanto Se configurado == falso Então //Chama função para configuração da ferramenta; Form_Configuração.Show; Fim Se Se configurado == Verdadeiro Então Tenta //Inclui registro na tabela INSTANCIAS; INSERT INTO INSTANCIAS (CD_ACESSO, LOGIN, BASE_DADOS, DT_ACESSO) VALUES (SEQ_CD_ACESSO.NEXTVAL, Edit Login.Texto, Edit Base de Dados.Texto, SysDate); Commit; Habilita funções do sistema; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta Fim Se Fim Se Botão Desconectar OnClick Desconecta a ferramenta em um banco de dados. Execute = Disconnect; Desabilita funções do sistema; Botão Fechar OnClick Fecha a ferramenta. Form_Principal.Fechar; Especificação de Instalação da Ferramenta Fluxo de Execução: CONSULTA NAME DA TABELA SYS.USER$ ONDE TYPE# = 1 88 ORDENADO PRO NAME Memo Usuário = Consulta Acima; Edit Banco de Dados = Form_Principal.Edit Base de Dados.Texto; Se Form_Principal.configurado == Verdadeiro Então Habilita botão Desinstalar; Memo Usuário = Desabilitado; Fim Se Se Form_Principal.configurado == Falso Então Habilita botão Instalar; Memo Usuário = Habilitado; Fim Se Eventos dos Componentes Botão Instalar OnClick Instala a ferramenta no banco de dados. //só realiza a instalação se um usuário foi selecionado Se Memo.Usuario.Texto == Selecionado Então Cria tabelas da ferramenta no usuário selecionado na base de dados. //as tabelas estão de acordo com o Apêndice A Form_Principal.configurado = verdadeiro; Habilita funções no Form_Principal; Fim Se Botão Desinstalar OnClick Desconectar a ferramenta no banco de dados. Apaga tabelas da ferramenta no usuário selecionado na base de dados. //as tabelas estão de acordo com o Apêndice A Form_Principal.configurado = falso; Desabilita funções no Form_Principal; Botão Fechar OnClick Fecha a ferramenta. Form_Configuracao.Fechar; Especificação de Visualização da Estrutura Lógica da Memória Fluxo de Execução: //Grava informações da ação do usuário na tabela ACOES Tenta 89 INSERT INTO ACOES (CD_ACAO, CD_INSTANCIA, DT_ACAO, ID_ACAO) VALUES (SEQ_CD_ACAO.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, SysDate, ‘03’); Commit; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break(); Fim Tenta //Chama procedimento para visualização da estrutura da memória lógica Visualização; Timer = Habilitado; Eventos dos Componentes Timer OnTimer Executa o comando após intervalo de tempo de execução. //Chama procedimento para visualização da estrutura da memória lógica //Este procedimento é chamado a cada minuto Visualização; Botão Fechar OnClick Fecha a ferramenta. Form_Estrutura_Memoria_Logica.Fechar; Procedimentos Procedimento Visualização; //Consulta informações da shared pool Consulta TAMANHO_TOTAL_SHARED_POOL as T_SHARED, TRUNCA((100 * TAMANHO_UTILIZADO_SHARED_POOL) / TAMANHO_TOTAL_SHARED_POOL) as P_SHARED Da tabela SHARED_POOL; //Atualiza dados na tela Label Shared.Texto = T_SHARED; Shared.Valor = P_SHARED; //Consulta informações da database buffer cache 90 Consulta TAMANHO_TOTAL_DATABASE_BUFFER_CACHE as T_DATABASE TRUNCA((100 * TAMANHO_UTILIZADO_ DATABASE_BUFFER_CACHE) / TAMANHO_TOTAL_ DATABASE_BUFFER_CACHE) as P_DATABASE Da tabela DATABASE_BUFFER_CACHE; //Atualiza dados na tela Label Database.Texto = T_DATABASE; Database.Valor = P_DATABASE; //Consulta informações da redo log Consulta TAMANHO_TOTAL_REDO_LOG as T_REDO TRUNCA((100 * TAMANHO_UTILIZADO_ REDO_LOG) / TAMANHO_TOTAL_ REDO_LOG) as P_REDO Da tabela REDO_LOG; //Atualiza dados na tela Label Redo.Texto = T_ REDO; Redo.Valor = P_REDO; //Consulta informações da java pool Consulta TAMANHO_TOTAL_JAVA_POOL as T_JAVA TRUNCA((100 * TAMANHO_UTILIZADO_ JAVA_POOL) / TAMANHO_TOTAL_ JAVA_POOL) as P_JAVA Da tabela JAVA_POOL; //Atualiza dados na tela Label Java.Texto = T _ JAVA; Java.Valor = P_JAVA; //Consulta informações da large pool Consulta TAMANHO_TOTAL_LARGE_POOL as T_LARGE TRUNCA((100 * TAMANHO_UTILIZADO_ LARGE_POOL) / TAMANHO_TOTAL_ LARGE_POOL) as P_LARGE Da tabela LARGE_POOL; //Atualiza dados na tela Label Large.Texto = T _ LARGE; Large.Valor = P_LARGE; Tenta INSERT INTO MEMORIA_LOGICAS 91 (CD_MEMORIA_LOGICA, CD_INSTANCIA, CD_ACAO, TM_SHARED_POOL, TM_DATABASE, TM_REDO_LOG, TM_JAVA_POOL, TM_LARGE_POOL, PC_SHARED_POOL, PC_DATABASE, PC_REDO_LOG, PC_JAVA_POOL, PC_LARGE_POOL, DT_ATUALIZACAO) VALUES (SEQ_CD_MEMORIA_LOGICA.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, CD_ACAO gerada na entrada da função, T _SHARED, T_DATABASE, T_REDO, T_JAVA, T_LARGE, P_SHARED, P_DATABASE, P_REDO, P_JAVA, P_LARGE, SysDate); Commit; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta Fim Procedimento Especificação de Visualização da Shared Pool Fluxo de Execução: //Grava informações da ação do usuário na tabela ACOES Tenta INSERT INTO ACOES (CD_ACAO, CD_INSTANCIA, DT_ACAO, ID_ACAO) VALUES (SEQ_CD_ACAO.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, SysDate, ‘02’); Commit; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta //Declaração de variáveis memoria_total number; memoria_objeto number; memoria_shared_sql number; memoria_cursor number; memoria_utilizado number; memoria_livre number; memoria_percentagem number; dicionario_cache_percentagem number; biblioteca_cache_percentagem number; //valor total alocado para shared pool Consulta pa.Value into memoria_total 92 Da tabela V$PARAMETER pa Onde pa.Name = ‘shared_pool_size’; //valor total gasto com pacotes com armazenamento de objetos (packages, views) Consulta sum(doc.sharable_mem) into memoria_objeto Da tabela V$DB_OBJECT_CACHE doc; //valor total gasto com o shared sql //se utiliza o sql dinâmico necessita ter memória adicional Consulta sum(sa.sharable_mem) into memoria_shared_sql Da tabela V$SQLAREA sa; //supõe 250 bytes por cursor aberto, para cada usuário simultâneo Consulta sum(250*sa.users_opening) into memoria_cursor Da tabela V$SQLAREA sa; //valor total da memória utilizada memoria_utilizada = (memoria_objeto + memoria_shared_sql + memoria_cursor); //memória livre (não utilizada) no SGA: dá uma inidcaçãod e quanto de memória não //está sendo utilizada Consulta st.bytes into memoria_livre Da tabela V$SGASTAT st Onde st.Name = ‘free memory’; //consulta percentual de utilização do dicionário cache Consulta decode(sum(rc.gets),0,0,((sum(rc.gets) – sum(rc.getmisses))/sum(rc.gets))*100) into memória_dicionario_cache Da tabela V$ROWCACHE rc; //consulta percentual de utilização do biblioteca cache Consulta decode(sum(lc.pins),0,0,((sum(lc.pins) – memória_biblioteca_cache Da tabela V$LIBRARYCACHE lc; sum(lc.reloads))/sum(lc.pins))*100) //valor percentual de utilização da memória no formato 99,99 Memória_percentagem = (memória_utilizada/memória_total)*100; //preenche componentes edits Edit Alocado.Texto = memória_alocada / 1024 / 1024 + ‘MB’; Edit Utilizado.Texto = memória_alocada / 1024 / 1024 + ‘MB’; Edit Livre.Texto = memória_alocada / 1024 / 1024 + ‘MB’; Edit Percentagem.Texto = memória_percentagem; Edit Dicionario.Texto = memória_dicionario_cache; Edit Biblioteca.Texto = memória_biblioteca_cache; Tenta INSERT INTO SHARED_POOLS 93 into (CD_SHARED_POOL, CD_INSTANCIA, CD_ACAO, TAMANHO_TOTAL, TAMANHO_UTILIZADO, TAMANHO_LIVRE, PERCENTAGEM_UTILIZADA, DT_ATUALIZACAO, DICIONARIO_CACHE, BIBLIOTECA_CACHE) VALUES (SEQ_CD_SHARED_POOL.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, CD_ACAO gerada na entrada da função, memória_total, memória_utilizada, memória_livre, memória_percentagem, SysDate, memória_dicionario_cache, memória_biblioteca_cache); Commit; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta //consulta dados para incluir no Grid Visualizações CONSULTA TAMANHO_TOTAL, PERCENTAGEM_UTILIZADA, BIBLIOTECA_CACHE, DT_VISUALIZACAO DA TABELA SHARED_POOLS S, ACOES A ONDE S.CD_ACAO = A.CD_ACAO E A.ID_ACAO = ‘02’ E S.CD_INSTANCIA IN (SELECT CD_INSTANCIA DA TABELA INSTANCIAS ONDE BASE_DADOS = BASE_DADOS criado na tabela ACESSOS) ORDENADO POR DT_VISUALIZACAO DESC; DICIONARIO_CACHE, Eventos dos Componentes Botão Fechar OnClick Fecha a ferramenta. Form_Visualização_Shared_Pool.Fechar; Especificação de Análise do Plano de Execução Fluxo de Execução: //Grava informações da ação do usuário na tabela ACOES Tenta INSERT INTO ACOES (CD_ACAO, CD_INSTANCIA, DT_ACAO, ID_ACAO) VALUES (SEQ_CD_ACAO.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, SysDate, ‘08’); Commit; Se Erro Rollback; 94 Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta Eventos dos Componentes Botão Abrir OnClick Abre arquivo para realizar a análise do plano de execução. //Chama tela para abrir arquivos e recebe arquivo selecionado Memo.Comando.Texto = Null; Memo.Comando.CarregaArquivo(nome do arquivo selecionado na tela ‘Abrir Arquivo’); Botão Salvar OnClick Salva comando SQL. //Chama tela para salvar comando SQL em arquivo Se Memo.Comando.Texto <> Null Então Memo.Comando.SalvaArquivo(Memo.Comando.Texto para a tela ‘Salvar Arquivo’); Fim Se Botão Executar OnClick Executa comando SQL. //Executa comando SQL para análise do plano de execução Tenta EXPLAIN PLAN [SET STATEMENT_ID = ‘COMANDO’] PARA Memo.Comando.Texto; CONSULTA LPAD(‘ ‘, 2 * (LEVEL – 1)) || operation || ‘ ’ || options || ‘ ‘ || object_name || ‘ ‘ || DECODE(id, 0, ‘Cost = || position) “Execution Plan” Da tabela plan_tab START WITH id = 0 E statement_id = ‘COMANDO’ CONNECT BY PRIOR id = parent_id E statement_id = ‘COMANDO’; Memo.Execução.Texto = Null; Memo.Execução.Texto = Campos da consulta acima; Se Erro Rollback; Gerar Mensagem (“Sintaxe do comando SQL incorreta.”); Break; Fim Tenta 95 Button Fechar OnClick Fecha a ferramenta. Form_Plano_Execucao.Fechar; Especificação de Reconstrução de Índices Fluxo de Execução: //seleciona usuários da base de dados Consulta DISTINCT OWNER Da tabela DBA_TABLES Combobox.Owner.Texto = Form_Principal.Edit Login.Texto; Combobox Owner.Items = Campo OWNER da consulta acima; Eventos dos Componentes Botão Analisar OnClick Este procedimento executa uma consulta para validação da estrutura de registros na base de dados e analisa os índices. //campos obrigatórios para conexão Se Edit Percentagem.Texto == Null Então Gerar Mensagem(‘Preencher o campo Percentagem’); Edit Percentagem = Focalizado; Break(); Fim Se Se Edit Altura.Texto == Null Então Gerar Mensagem(‘Preencher o campo Altura’); Edit Altura = Focalizado; Break(); Fim Se //Grava informações da ação do usuário na tabela ACOES Tenta INSERT INTO ACOES (CD_ACAO, CD_INSTANCIA, DT_ACAO, ID_ACAO) VALUES (SEQ_CD_ACAO.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, SysDate, ‘08’); Commit; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); 96 Break; Fim Tenta //busca índices do usuário Consulta INDEX_NAME, OWNER Da tabela DBA_INDEXES Onde OWNER = BASE_DADOS na conexão com a ferramenta; ENQUANTO Not Fim da Consulta FAÇA //valida estruturas de índices Execute = ‘ANALYZE INDEX ‘ || OWNER da consulta acima || ‘.’ || INDEX_NAME da consulta acima || ‘ VALIDADE STRUCTURE’; //verifica se há necessidade de reconstrução de índice CONSULTA name, height, lf_rows, del_lf_rows DA TABELA INDEX_STATS; SE del_lf_rows > 0 ENTÃO var_perc = (del_lf_rows / lf_rows) * 100; FIM SE var_analise = falso; SE Radiobutton OU == Selecionado Então SE (height >= Edit Altura.Texto) OU (var_perc >= Edit Percentagem.Texto) ENTÃO var_analise = verdadeiro; FIM SE Fim Se SE Radiobutton E == Selecionado Então SE (height >= Edit Altura.Texto) E (var_perc >= Edit Percentagem.Texto) ENTÃO var_analise = verdadeiro; FIM SE Fim Se SE var_analise == verdadeiro Então var_comando = ‘ALTER INDEX ‘ + OWNER da consulta em dba_indexes + ‘.’ + INDEX_NAME da consulta em dba_indexes + ‘REBUILD’; //grava informações de reconstrução do índice na tabela INDICES Tenta INSERT INTO INDICES (CD_INDICE, CD_INSTANCIA, CD_ACAO, NOME, ALTURA, NR_LINHAS, NR_APAGADAS, PERCENTAGEM, COMANDO, ID_STATUS, DT_STATUS) VALUES (SEQ_CD_INDICE.NEXTVAL, CD_INSTANCIA gerado na entrada do usuário na base de dados, CD_ACAO gerada na entrada da função, INDEX_NAME da consulta em index_stats, HEIGHT da consulta em index_stats, LF_ROWS da consulta em index_stats, DEL_LF_ROWS da consulta em index_stats, var_perc, var_comando, ‘1’, SysDate); 97 Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta Fim Se Consulta em DBA_INDEXES.Próximo Registro; FIM ENQUANTO //pega índices a serem reconstruídos para o grid índices CONSULTA CD_INDICE, NOME, ALTURA, NR_LINHAS, NR_APAGADAS, PERCENTAGEM, COMANDO DA TABELA INDICES ONDE CD_ACAO = CD_ACAO criado na tabela ACOES E ID_STATUS = 1 SE nº de registros retornados da consulta acima > 0 ENTÃO Grid Índices = Receba dados da consulta acima; Grid Índices = Habilitado; Button Reconstruir = Habilitado; FIM SE Botão Reconstruir OnClick Procedimento para reconstruir os índices analisados. //reconstrói índices vindos da consulta da tabela INDICES Consulta em INDICES.Primeiro Registro; ENQUANTO Not Consulta em INDICES == Fim de Registros Então //executa reconstrução Execute(Campo COMANDO da consulta na tabela INDICES); Tenta UPDATE INDICES SET ID_STATUS = ‘2’, DT_STATUS = SysDate WHERE CD_INDICE = Campo CD_INDICE da consulta na tabela INDICES; Se Erro Rollback; Gerar Mensagem (“Erro na conexão ao banco de dados.”); Break; Fim Tenta Consulta em INDICES.Próximo Registro; FIM ENQUANTO Botão Fechar OnClick Fecha a ferramenta. 98 Form_Plano_Execucao.Fechar; Especificação de Ajuste de Esquemas Fluxo de Execução: Não possui fluxo de execução Eventos dos Componentes Botão Visualizar Tabelas OnClick Chama tela para visualização das tabelas. Panel Visualiza_Tabelas.Show; Botão Cria Tabelas OnClick Chama tela para criação das tabelas. Panel Cria_Tabelas.Show; Botão Visualizar Índices OnClick Chama tela para visualização dos índices. Panel Visualiza_Indices.Show; Botão Cria Índices OnClick Chama tela para criação dos índices. Panel Cria_Indices.Show; Botão Fechar OnClick Fecha a ferramenta. Form_Ajuste_Esquemas.Fechar; Especificação de Visualização de Tabelas Fluxo de Execução: //Busca usuários da base de dados CONSULTA NAME DA TABELA SYS.USER$ ONDE TYPE# = 1 ORDENADO POR NAME 99 Combobox.Usuário.Texto = Form_Principal.Edit Login.Texto; Combobox.Usuário.Itens = Consulta Acima; Edit Banco de Dados = Form_Principal.Edit Base de Dados.Texto; //busca tabelas do usuário logado no sistema CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Form_Principal.Edit Login.Texto; Listbox Tabelas = TABLE_NAME da consulta acima; Eventos dos Componentes Combobox Usuários OnChange Seleciona usuário e mostra as tabelas desse usuário. //busca tabelas do usuário logado no sistema CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Combobox.Usuario.Texto.Selecionado; Listbox Tabelas = TABLE_NAME da consulta acima; Listbox Colunas = Null; Listbox Índices = Null; Edit Nº Registros = Null; Listbox Tabelas DuploClick Seleciona tabela e mostra as colunas e o número de registro dessa tabela. Execute(‘ANALYZE TABLE ‘ + Listbox Usuario.Item.Selecionado + ‘.’ + Listbox Tabelas.Item.Selecionado + ‘ COMPUTE STATISTICS’; //busca número de registros da tabela CONSULTA NUM_ROWS DA TABELA DBA_TABLES ONDE OWNER = Listbox Usuarios.Item.Selecionado E TABLE_NAME = Listbox Tabelas.Item.Selecionado; Edit N º Registros = NUM_ROWS da consulta acima; //busca colunas da tabela CONSULTA COLUMN_NAME DA TABELA ALL_UPDATABLE_COLUMNS ONDE OWNER = Listbox Usuarios.Item.Selecionado E TABLE_NAME = Listbox Tabelas.Item.Selecionado; Consulta em ALL_UPDATABLE_COLUMNS.Primeiro_Registro; ENQUANTO Consulta em ALL_UPDATABLE_COLUMNS <> Fim dos Registros FACA Listbox Colunas = COLUMN_NAME da consulta acima; 100 Consulta em ALL_UPDATABLE_COLUMNS.Próximo_Registro; FIM ENQUANTO //busca índices da tabela CONSULTA INDEX_NAME, INDEX_TYPE DA TABELA USER_INDEXES ONDE TABLE_OWNER = Listbox Usuarios.Item.Selecionado E TABLE_NAME = Listbox Tabelas.Item.Selecionado; Consulta em USER_INDEXES.Primeiro_Registro; ENQUANTO Consulta em USER_INDEXES <> Fim dos Registros FACA Listbox Índices = COLUMN_NAME da consulta acima; Consulta em USER_INDEXES.Próximo_Registro; FIM ENQUANTO Especificação de Criação de Tabelas Fluxo de Execução: //Busca usuários da base de dados CONSULTA NAME DA TABELA SYS.USER$ ONDE TYPE# = 1 ORDENADO POR NAME Combobox.Usuário.Texto = Form_Principal.Edit Login.Texto; Combobox.Usuário.Itens = Campo NAME da consulta Acima; Edit NomeTabela.Texto = Null; Memo Script.Texto = Null Botão IncluirTabela = Inabilitado; Panel Tabela = Visível; Panel Script = Visível; //Busca tabelas da base de dados CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Form_Principal.Edit Login.Texto; Combobox Tabelas = TABLE_NAME da consulta acima; Botão Tabela = Habilitado; Botão Campo = Desabilitado; Botão Chave Primaria = Desabilitado; Eventos dos Componentes Botão NovaTabela OnClick Dá início ao processo de criação da tabela. Se Edit NomeTabela.Texto <> Null Então 101 //Verifica se tabela já existe CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Form_Principal.Edit Login.Texto E TABLE_NAME = Edit NomeTabela; //Quando não existe então começa processo para criar tabela Se Nº de Registros Retornados > 0 Então Memo Script.Texto.AdicionaLinha = ‘CREATE TABLE ‘ + Combobox Usuário.Texto + ‘.’ + Edit NomeTabela.Texto + ‘(‘; Panel Tabela = Invisível; Panel Colunas = Visível; Fim Se //Quando existe tabela então manda mensagem Se Nº de Registros Retornados == 0 Então Mensagem(“Tabela já existe”); Fim Se Fim Se Botão IncluiColuna OnClick Adiciona coluna na tabela. Se Edit NomeColuna.Texto <> Null Então Memo Script.Texto.AdicionaLinha = Edit NomeColuna.Texto + ‘,’; Botão IncluirTabela = Habilitado; Edit NomeColuna.Texto = Null; Fim Se Botão IncluiTabela OnClick Finaliza processo de criação da tabela. Memo Script.Texto.AdicionaLinha = ‘)’; Execute(Memo.Script.Texto); //busca colunas da tabela CONSULTA COLUMN_NAME DA TABELA ALL_UPDATABLE_COLUMNS ONDE OWNER = Combobox Usuarios.Texto; E TABLE_NAME = Edit NomeTabela.Texto; ListBox Colunas = Campo COLUMN_NAME da consulta acima; Panel Colunas = Invisível; Panel Script = Invisível; Panel Chave Primária = Visível; 102 Botão IncluiChavePrimaria OnClick Adiciona chaveprimaria na tabela. Se (Listbox ChavePrimaria == Selecionado) e (Edit NomeChave <> Null) Então var_schema = ‘ALTER TABLE ‘ + combobox.usuario.texto + ‘.‘ + Edit Tabela.Texto + ‘ADD (CONSTRAINT ‘ var_schema = var_schema + Edit NomeChave + ‘ ( ‘; Listbox ChavePrimaria.Primeiro Registro; Enquanto Not Fim dos Registros em Listbox ChavePrimaria Faça var_schema = var_schema + Listbox.Texto[Listbox.Item]; Se Listbox ChavePrimaria <> Último Registro Então var_schema = var_schema + ‘,’; Fim Se Listbox ChavePrimaria.Próximo Registro; Fim Enquanto var_schema = var_schema + ‘))’; Execute(var_schema); Panel Chave Primária = Invisível; Panel Tabela = Visível; Panel Script = Visível; Fim Se Especificação de Visualização de Índices Fluxo de Execução: //Busca usuários da base de dados CONSULTA NAME DA TABELA SYS.USER$ ONDE TYPE# = 1 ORDENADO POR NAME Combobox.Usuário.Texto = Form_Principal.Edit Login.Texto; Combobox.Usuário.Itens = Campo NAME da consulta Acima; //busca tabelas do usuário logado no sistema CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Form_Principal.Edit Login.Texto; Listbox Tabelas = TABLE_NAME da consulta acima; Eventos dos Componentes Botão Visualizar 103 OnClick Visualiza os índices do usuário selecionado. //Busca índices da base de dados CONSULTA NOME_INDICES, TABLE_NAME DA TABELA DBA_INDEXES ONDE OWNER = Combobox.Texto; Se Nº de Regitros Retornados na Consulta Acima > 0 Então Grid Índices = Campos da consulta acima; Botão Detalhes = Desabilitado; Fim Se Se Nº de Regitros Retornados na Consulta Acima == 0 Então Grid Índices = Null; Botão Detalhes = Desabilitado; Fim Se Grid Índices OnClick Seleciona um registro no grid índices. //quando da seleção de um registro Botão Detalhes = Habilitado; Botão Detalhes OnClick Visualiza detalhes do índice selecionado. //Busca índices da base de dados Execute = ‘ANALYZE INDEX ‘ || Combobox Usuário.Texto || ‘.’ || INDEX_NAME do registro selecionado no grid índices || ‘ VALIDADE STRUCTURE’; //verifica se há necessidade de reconstrução de índice CONSULTA height, lf_rows, del_lf_rows DA TABELA INDEX_STATS; Edit Nº Registro = lf_rows da consulta acima; Edit Nº Registro Apagados = del_lf_rows da consulta acima; Edit Nº Registro Válidos = lf_rows – del_lf_rows da consulta acima; Especificação de Criação de Índices Fluxo de Execução: //Busca usuários da base de dados CONSULTA NAME DA TABELA SYS.USER$ ONDE TYPE# = 1 ORDENADO POR NAME 104 Combobox.Usuário.Texto = Form_Principal.Edit Login.Texto; Combobox.Usuário.Itens = Campo NAME da consulta Acima; //Busca tabelas da base de dados CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Form_Principal.Edit Login.Texto; Combobox Tabelas.Texto = Form_Principal.Edit Login.Texto; Combobox Tabelas.Campo = TABLE_NAME da consulta acima; Eventos dos Componentes: Combobox Usuário OnChange Inicia procedimento para criação de um novo índice. //Busca tabelas da base de dados CONSULTA TABLE_NAME DA TABELA USER_TABLES ONDE OWNER = Combobox.Usuário.Texto; Combobox Tabelas.Texto = Form_Principal.Edit Login.Texto; Botão NovoÍndice OnClick Inicia procedimento para criação de um novo índice. //Busca índices da base de dados Se Botão NovoIndice.Texto == ‘Novo Índice‘ Então Se (Combobox TipoIndice.Texto <> Null) E (Edit NomeIndice.Texto <> Null) Então Botão CancelaÍndice = Habilitado; Botão NovoÍndice.Texto = ‘Inclui Índice’; Combobox Usuário = Desabilitado; Combobox Tabela = Desabilitado; //busca colunas da tabela CONSULTA COLUMN_NAME DA TABELA ALL_UPDATABLE_COLUMNS ONDE OWNER = Listbox Usuarios.Item.Selecionado E TABLE_NAME = Listbox Tabelas.Item.Selecionado; Botão IncluiCampo = Habilitado; Fim Se Senão //verifica se coluna já existe CONSULTA COLUMN_NAME DA TABELA ALL_UPDATABLE_COLUMNS ONDE OWNER = Listbox Usuarios.Item.Selecionado E TABLE_NAME = Listbox Tabelas.Item.Selecionado 105 E COLUMN_NAME = Edit NomeIndice.Texto; Se Nº de Registros Retornados == 0 Então var_schema = ‘CREATE INDEX ‘ + combobox.usuario.texto + ‘.‘ + Edit NomeIndice.Texto + ‘ ON ‘ + combobox.tabela.texto + ‘ (‘; Listbox.Coluna.Primeiro Registro; Enquanto Not Fim dos Registros em Listbox Coluna Faça var_schema = var_schema + Listbox.Coluna.Texto[Listbox.Coluna.Item]; Se Listbox Coluna <> Último Registro Então var_schema = var_schema + ‘,’; Fim Se Listbox Coluna.Próximo Registro; Fim Enquanto var_schema = var_schema + ‘)’; Execute(var_schema); Botão CancelaÍndice = Desabilitado; Botão NovoÍndice.Texto = ‘Novo Índice’; Combobox Usuário = Habilitado; Combobox Tabela = Habilitado; ListBox.Indices.Itens = Null; Fim Se Se Nº de Registros Retornados > 0 Então Mensagem(“Índice já existe.”); Fim Se Fim Se Botão Cancelar OnClick Visualiza detalhes do índice selecionado. Botão CancelaÍndice = Desabilitado; Botão NovoÍndice.Texto = ‘Novo Índice’; Combobox Usuário = Habilitado; Combobox Tabela = Habilitado; ListBox.Indices.Itens = Null; Especificação de Consulta de Acessos Fluxo de Execução: //Busca usuários da base de dados CONSULTA NAME DA TABELA SYS.USER$ ONDE TYPE# = 1 106 ORDENADO POR NAME Combobox.Usuário.Texto = Form_Principal.Edit Login.Texto; Combobox.Usuário.Itens = Campo NAME da consulta Acima; Eventos dos Componentes Botão Visualizar Acessos OnClick Inicia procedimento para visualização dos acessos. //busca registros de acessos a ferramenta Se Combobox Usuário.Texto <> ‘TODOS’ Então CONSULTA J.DT_ACESSO, J.CD_INSTANCIA, J.LOGIN, (CONSULTA COUNT(A.CD_INSTANCIA) DA TABELA ACOES A, INSTANCIAS I ONDE I.CD_INSTANCIA = J.CD_INSTANCIA E I.CD_INSTANCIA = A.CD_INSTANCIA E I.BASE_DADOS = Form_Principal.Edit Base Dados.Texto E I.LOGIN = Combobox.Usuario.Texto) AS NR_ACOES DA TABELA INSTANCIAS J ONDE J.LOGIN = Combobox.Usuario.Texto E J.BASE_DADOS = Form_Principal.Edit Base Dados.Texto E J.DT_ACESSO >= Edit Data Inicial.Texto E J.DT_ACESSO <= Edit Data Final.Texto; Fim Se Se Combobox Usuário.Texto == ‘TODOS’ Então CONSULTA J.DT_ACESSO, J.CD_INSTANCIA, J.LOGIN, (CONSULTA COUNT(A.CD_INSTANCIA) DA TABELA ACOES A, INSTANCIAS I ONDE I.CD_INSTANCIA = J.CD_INSTANCIA E I.CD_INSTANCIA = A.CD_INSTANCIA E I.BASE_DADOS = Form_Principal.Edit Base Dados.Texto) AS NR_ACOES DA TABELA INSTANCIAS J ONDE J.BASE_DADOS = Form_Principal.Edit Base Dados.Texto E J.DT_ACESSO >= Edit Data Inicial.Texto E J.DT_ACESSO <= Edit Data Final.Texto; Fim Se Se Nº de Registros Retornados > 0 Então Grid Acessos = Campos da consulta acima; Grid Acessos = Habilitado; Grid Ações = Habilitado; Fim Se Se Nº de Registros Retornados == 0 Então Grid Acessos = Desabilitado; 107 Grid Ações = Desabilitado; Botão Visualizar Ações = Desabilitado; Fim Se Botão Visualizar Ações OnClick Inicia procedimento para visualização das ações. //busca as ações realizadas no acesso CONSULTA DT_ACAO, CASO ID_ACAO QUANDO '01' ENTÃO 'Reconstrução de Índices' QUANDO '02' ENTÃO 'Visualização da Shared Pool' QUANDO '03' ENTÃO 'Visualização da Estrutura Lógica da Memória' QUANDO '05' ENTÃO 'Criação de Tabelas' QUANDO '07' ENTÃO 'Criação de Índices' FIM DA TABELA ACOES ONDE CD_ACESSO = Campo CD_INSTANCIA do registro selecionado no Grid Acessos; Se Nº de Registros Retornados > 0 Então Grid Ações = Campos da consulta acima; Fim Se Se Nº de Registros Retornados == 0 Então Grid Ações = Desabilitado; Botão Visualizar Ações = Desabilitado; Fim Se Grid Acessos OnClick Quando seleciona um registro. Botão Visualiza Acessos = Habilitado; Botão Fechar OnClick Fecha a ferramenta. Form_Consulta_Acessos.Fechar; Especificação de Consulta de Índices Fluxo de Execução: //Busca usuários da base de dados CONSULTA NAME DA TABELA SYS.USER$ 108 ONDE TYPE# = 1 ORDENADO POR NAME Combobox.Usuário.Texto = Form_Principal.Edit Login.Texto; Combobox.Usuário.Itens = Campo NAME da consulta Acima; Eventos dos Componentes Botão Buscar OnClick Inicia procedimento para visualização dos índices reconstruídos. //busca registros de acessos a ferramenta CONSULTA I.NOME, I.ALTURA, I.PERCENTAGEM, I.DT_STATUS DA TABELA INDICES I, INSTANCIAS J, ACOES A ONDE J.BASE_DADOS = Combobox.Usuario.Texto E J.LOGIN = Form_Principal.Edit Base Dados.Texto E J.DT_ACESSO >= Edit Data Inicial.Texto E J.DT_ACESSO <= Edit Data Final.Texto E J.CD_INSTANCIA = A.CD_INSTANCIA E A.ID_ACAO = '01' E A.CD_ACAO = I.CD_ACAO E I.ID_STATUS = '2'; Se Nº de Registros Retornados > 0 Então Grid Índices = Campos da consulta acima; Fim Se Button Fechar OnClick Fecha a ferramenta. Form_Consulta_Indices.Fechar; 109 APÊNDICE C – INSTALAÇÃO DA FERRAMENTA Para utilização da ferramenta é necessária a sua instalação no banco de dados que irá ser realizado a análise e ajuste de desempenho. Quando um usuário executa pela primeira vez conexão com o banco de dados através da ferramenta se tem como passo inicial a sua instalação necessitando a seleção de um usuário desta base de dados para a criação das tabelas que irão servir como histórico da utilização da ferramenta, como mostra a Figura 1: Mensagens Após a Instalação Banco de Dados Usuários Figura 1: Início da Instalação da Ferramenta Após a instalação da ferramenta acontece a alteração de um arquivo nomeado de configuração.sql, onde irá constar o nome da base de dados, identificado com os caracteres “1|”, e o usuário em que se encontra instalada a ferramenta, identificado na próxima linda. A Figura 2 relata este arquivo. 110 Base de Dados Usuários Figura 2: Arquivo configuracao.sql Sendo assim, quando o usuário solicitar conexão ao banco de dados, o primeiro passo é percorrer o arquivo configuracao.sql e identificar se a base de dados possui a instalação da ferramenta. Caso a afirmação não for confirmada, a única funcionalidade disponível ao usuário é a instalação da mesma, porém, se há a instalação, então todas as funções ficam disponibilizadas. Como último passo há a opção de desinstalar a ferramenta, sendo que neste caso é removido o nome da base de dados e do usuário do arquivo configuraco.sql. Por fim, recomenda-se a criação de um usuário específico para a utilização da ferramenta. Ressalta-se ainda que tanto o usuário que irá se conectar à ferramenta quanto o usuário selecionado para a sua instalação tenham previlégios de DBA. 111 ANEXO I – RESUMO PUBLICADO NO CRICTE 2004 112 ANEXO II – ARTIGO 113