Sei sulla pagina 1di 19

O conhecimento da arquitetura interna do ORACLE de extrema importncia para a compreenso das tcnicas de otimizao do produto.

. Basicamente, os seus mecanismos de execuo so as estruturas de memria e os processos executados em background. Todas as vezes que um banco inicializado, uma SGA alocada e os processos so inicializados. A combinao das estruturas de memria na SGA e dos processos em background chamada de instncia ORACLE. Algumas arquiteturas de hardware permitem mltiplos computadores compartilharem os mesmos dados, softwares ou perifricos. Com a opo Parallel Server do ORACLE, podemos tirar proveito dessa caracterstica atravs da execuo de mltiplas instncias que compartilham um nico banco de dados. Assim, os usurios de diversas mquinas podem acessar o mesmo banco de dados com uma melhoria na performance. SGA A SGA um grupo de buffers de memria compartilhados que so destinados pelo ORACLE para uma instncia. Basicamente formada pelas estruturas identificadas por shared pool, database buffer cache e redo log buffer cache. Entretanto, em algumas configuraes do ORACLE podem existir outras estruturas. Processos em Background Os processos em background executam tarefas distintas assincronicamente em benefcio a todos os usurios de um banco de dados. No existe uma relao direta entre os processos em background e os processos dos usurios conectados a uma instncia ORACLE. Apesar de poderem existir outros em uma instncia, o que depende da configurao do ORACLE utilizada, os processos mais conhecidos so o PMON, SMON, DBWR, LGWR, RECO, LCK, CKPT e o ARCH. Geralmente um banco de dados est associado a somente uma instncia. Entretanto, como vimos, em algumas configuraes do ORACLE, um banco de dados pode estar associado a mais de uma instncia. Assim, precisamos diferenciar os dois conceitos: um banco de dados formado pelos arquivos fisicamente armazenados em disco enquanto que uma instncia formada pelas estruturas e processos em memria. O banco de dados permanente, enquanto que uma instncia voltil. Naturalmente, para acessarmos um banco de dados necessrio que uma instncia seja inicializada e associada a ele. Estruturas de Memria As estruturas de memria so criadas pelo ORACLE e usadas para completar diversas tarefas. Por exemplo, elas so usadas para guardar o cdigo de um programa que est sendo executado e os dados que podem ser compartilhados pelos usurios. SGA e PGA. As principais estruturas so a SGA (System Global Area ou rea Global do Sistema) e a PGA (Program Global Area ou rea Global de Programa). A PGA o buffer de memria que contm dados e algumas informaes de controle de uma sesso de um usurio. A PGA criada e alocada quando um novo processo inicializado no servidor. As suas informaes dependem da configurao do ORACLE. Assim, existe uma rea de memria PGA para cada usurio que est executando seus trabalhos no ORACLE. Dentro da PGA existem trs estruturas: uma contendo um espao

para a pilha (para armazenar as variveis e matrizes), outra contendo dados sobre a sesso do usurio e uma terceira com as informaes dos cursores usados. A PGA no compartilhada entre os usurios; ela nica para cada sesso. A SGA uma regio de memria compartilhada por todos os usurios e alocada pelo ORACLE. Contm os dados e as informaes de controle de uma instncia. Ela alocada quando uma nova instncia inicializada e liberada quando a mesma finalizada. Os dados na SGA so compartilhados pelos usurios que estiverem conectados ao banco de dados e, para otimizar a performance, as entradas na SGA devem ser as maiores possveis para guardar a maior quantidade de dados e minimizar o I/O em disco, uma das causas crticas que tornam um banco de dados lento. As informaes na SGA esto organizadas em diversos tipos de estruturas de memria, incluindo o buffer do banco de dados e o buffer para recuperao do banco, por exemplo. As estruturas tm tamanho fixo e so criadas durante a inicializao da instncia. O grupo de buffers do banco de dados em uma instncia so chamados de database buffer cache. Esses buffers podem conter os dados modificados que ainda no foram escritos em disco, para os arquivos de dados apropriados. Desse modo o I/O minimizado e h uma melhora significativa da performance. Essa estrutura compartilhada entre todos os usurios conectados a um banco de dados e os blocos de dados que so armazenados no database buffer cache tm seus tamanhos determinados pelo parmetro DB_BLOCK_SIZE. O nmero de blocos em memria determinado pelo parmetro DB_BLOCK_BUFFERS. O contedo do database buffer cache organizado em duas listas: a lista de blocos alterados e a lista dos blocos menos recentemente utilizados (LRU - Least Recently Used). Essa segunda lista contm os blocos livres, aqueles que esto em uso e os blocos alterados. Quando um processo servidor precisa ler dados de um bloco do disco para o database buffer cache, ele pesquisa a LRU para localizar um bloco livre e, quando encontrar um bloco alterado, movimenta-o para a lista de blocos alterados. Esse processo termina quando um bloco livre localizado ou quando um nmero especfico de blocos so pesquisados sem encontrar um bloco livre. Durante uma operao de SELECT, o ORACLE requer que os blocos que contm a informao desejada esteja em memria. Assim, a lista LRU pesquisada e, se os blocos no estiverem em memria, o produto efetua as leituras fsicas necessrias. Caso o bloco esteja em memria, so efetuadas leituras lgicas. Lembremo-nos de que nenhuma tabela pode ocupar menos de dois blocos de dados: um bloco para o cabealho e pelo menos outro bloco de dados. O redo log buffer cache da SGA armazena todas as alteraes feitas em um banco de dados em memria. Todas as entradas redo log neste buffer so escritas nos arquivos redo log, que so usados para a recuperao do banco de dados, se necessrio.

A shared pool uma poro de memria compartilhada que contm as reas chamadas shared SQL, estruturas de memria compartilhadas que contm os comandos SQL que esto sendo executados pelos mltiplos usurios conectados a um banco de dados. Essas reas compartilhadas shared SQL contm informaes como o texto e a forma interpretada dos comandos SQL, a fase de anlise dos comandos SQL e seus planos de execuo, informaes do dicionrio de dados e de geradores de nmeros seqenciais. Uma nica rea shared SQL pode ser compartilhada por diversas aplicaes que usam o mesmo comando definido na rea compartilhada de comandos SQL, deixando assim mais rea em memria disponvel para os outros usurios e melhorando a performance de execuo de um comando, j que o plano de execuo j est definido e o ORACLE no precisa defini-lo novamente. A shared pool contm ainda o data dictionary cache, com as informaes do dicionrio de dados, e o sequence cache, com as informaes dos geradores de nmeros seqenciais. Um cursor um nome ou ponteiro para a memria associada a um comando especfico. Muitas aplicaes ORACLE tiram proveito dos cursores. Processos. Os processos podem ser vistos como programas que trabalham em memria (em background) e executam outras tarefas especficas para o ORACLE. Um processo uma forma de controle ou um *mecanismo no sistema operacional que pode executar uma srie de passos e normalmente tem sua rea particular de memria. Alguns sistemas operacionais usam o termo job ou tarefa. Existem dois tipos gerais de processos: os processos dos usurios e os processos do prprio ORACLE. Um processo de usurio criado e mantido para executar o cdigo da aplicao (por exemplo um programa Pro*C) ou uma ferramenta ORACLE (por exemplo o SQL*Plus). Os processos dos usurios tambm gerenciam a comunicao com os processos do servidor ORACLE atravs do program interface. Os processos ORACLE so chamados por outros processos para executar algumas funes especficas. O produto cria os processos servidores (server process) para controlar as requisies dos processos dos usurios conectados a um banco de dados. Assim, os processos servidores so incumbidos de comunicar-se com os processos dos usurios e interagir com o ORACLE para acessar seus recursos. Por exemplo, se um usurio pesquisa alguns dados que no estejam no database buffer cache da SGA, o processo servidor l os dados apropriados dos blocos de dados dos arquivos e os coloca na SGA, para uso dos usurios. Dependendo da configurao do ORACLE, um processo servidor pode ser compartilhado por diversos usurios.

Todos os comandos SQL so processados pelos processos servidores que se utilizam de trs fases para o processamento: anlise, execuo e busca dos dados. O plano de cada comando armazenado na SGA, nas reas que contm comandos SQL a serem compartilhados entre os usurios. O ORACLE cria um conjunto de processos que rodam em background para cada instncia. Esses processos executam diversas tarefas. So eles: DBWR, LGWR, CKPT, SMON, PMON, ARCH, RECO, Dnnn e LCKn. O processo database writer (DBWR) escreve os blocos modificados do database buffer cache para os arquivos de dados fsicos. O DBWR no precisa escrever os dados a cada comando COMMIT, pois otimizado para minimizar o I/O. Geralmente o DBWR escreve os dados para o disco se muitos dados so lidos para o database buffer cache na SGA e no existe espao livre para esses novos dados. Os dados menos recentemente usados so escritos para os arquivos de dados em primeiro lugar. O processo log writer (LGWR) escreve todas as entradas de redo log para o disco. Os dados de redo log so armazenados em memria no redo log buffer cache, na SGA. No momento em que uma transao for efetivada com o comando COMMIT e o redo log buffer estiver preenchido, o LGWR escreve as entradas de redo log nos arquivos redo log apropriados. A um tempo especfico, todos os dados do database buffer cache modificados so escritos em disco pelo processo DBWR; este evento chamado de checkpoint. O processo checkpoint responsvel para informar ao processo DBWR o momento de gravar os dados em disco. O DBWR tambm atualiza os arquivos de controle do banco de dados para indicar o mais recente checkpoint. O processo CKPT opcional; se ele no estiver presente, o LGWR assume sua responsabilidade. O processo system monitor (SMON) efetua a recuperao da instncia em caso de falhas, durante a sua inicializao. Em um sistema com mltiplas instncias (como na configurao Oracle Parallel Server, por exemplo), o processo SMON de uma instncia tambm pode executar a recuperao de outras instncias que podem ter falhado. Ele tambm limpa os segmentos temporrios que no esto sendo usados, liberando memria, e recupera qualquer transao pendente no caso de uma falha em arquivos fsicos ou mesmo no disco. O processo de recuperao dessas transaes executado pelo processo SMON quando a tablespace afetada volta a ficar disponvel. O process monitor (PMON) executa a recuperao do processo de um usurio quando esse processo falha. Limpa a rea de memria e libera os recursos que o processo do usurio estava usando. O PMON tambm verifica o processo despachante (dispatcher) e os processos servidores (server processes) e os reinicializa se tiver acontecido qualquer falha.

O processo archiver (ARCH) copia os arquivos redo log para fita ou mesmo outro disco, no momento em que um deles torna-se completo. Esse processo geralmente est presente quando o banco de dados est sendo utilizado no modo ARCHIVELOG. Os arquivos redo log nada tm a ver com auditoria. Eles so usados somente para a recuperao de um banco de dados. O processo recoverer (RECO) usado para resolver transaes distribudas pendentes causadas por uma falha na rede em um sistema de bancos de dados distribudos. A certos intervalos de tempo, o processo RECO do banco de dados local tenta conectar-se ao banco de dados remoto para automaticamente completar e efetivar a transao (COMMIT) ou descartar (ROLLBACK) a poro local de uma transao pendente em um sistema distribudo. Os processos em background dispatchers (Dnnn) so opcionais e esto presentes somente quando a configurao do Oracle Multi-thread Server usada. Pelo menos um processo dispatcher criado para cada protocolo de comunicao em uso (D000, D0001, ..., Dnnn). Cada processo dispatcher responsvel pelo direcionamento das requisies dos processos dos usurios conectados ao banco de dados para o processo servidor disponvel e pelo retorno da resposta de volta para o processo do usurio apropriado. Por sua vez, os processos lock (LCKn) so usados para controlar o lock entre instncias em uma configurao Parallel Server. Program interface. O program interface o mecanismo pelo qual um processo do usurio se comunica com o processo servidor. Serve como um mtodo de comunicao padro entre a poro cliente de uma aplicao ou uma ferramenta e o prprio servidor ORACLE. O program interface age como um mecanismo de comunicao, atravs da formatao dos dados requisitados, trafegando esses dados, verificando e retornando possveis erros. Tambm executa converses de dados, particularmente entre diferentes tipos de computadores ou tipos de dados usados pelos usurios. Se o usurio e os processos servidores esto em diferentes computadores de uma rede ou se o processo dispatcher estiver sendo usado para conectar processos de usurios e processos do servidor, ento o program interface inclui um software de comunicao chamado SQL*Net, que faz a comunicao e transferncia de dados entre computadores. Como o ORACLE trabalha Conhecendo os processos e estruturas de memria, fica bastante fcil para que entendamos o modo como ORACLE trabalha: 1. Consideremos que uma instncia esteja sendo executada em um computador (servidor de um banco de dados).

2. Um computador usado para executar uma aplicao (poro cliente ou front end) executa uma aplicao de um usurio. Essa aplicao cliente tenta estabelecer uma conexo com o servidor usando o driver apropriado do SQL*Net. 3. O servidor est executando o driver apropriado do SQL*Net e detecta a requisio de conexo da aplicao cliente e cria um processo servidor dedicado ao usurio. 4. O usurio executa um comando SQL e efetiva a transao com o comando COMMIT. 5. O processo servidor recebe o comando e verifica se as reas shared SQL, armazenadas na shared pool area, contm um comando idntico ao emitido pelo usurio. Se localiza uma rea shared SQL com um comando idntico, o processo servidor verifica os privilgios de acesso do usurio aos dados requisitados e o plano de execuo definido usado para buscar os dados solicitados. Se o comando emitido pelo usurio no estiver presente nessa rea, uma nova estrutura para o comando alocada e ento ele pode ser analisado e processado. 6. O processo servidor recupera qualquer valor armazenado nos arquivos de dados ou os busca da memria, se l estiverem, no database buffer cache. 7. O processo servidor modifica os dados na SGA. O processo DBWR escreve os dados modificados em disco, quando necessrio. No momento do comando COMMIT, o processo LGWR escreve imediatamente os registros das transaes no arquivo redo log que estiver sendo usado no momento. Se a transao for bem sucedida, o processo servidor manda uma mensagem atravs da rede para a aplicao. Se no for bem sucedida, uma mensagem de erro ento emitida. Acesso aos Dados Antes que os dados possam ser acessados, um processo servidor criado para um determinado usurio conectado ao ORACLE traz os blocos dos arquivos fisicamente armazenados nos discos para dentro do database buffer cache. Cada comando SQL armazenado na estrutura de memria shared pool e so compartilhados entre todos os usurios conectados a uma instncia. Em certo momento, os blocos de dados modificados pelos comandos dos usurios que se encontram no database buffer cache so escritos novamente para os arquivos de dados. Isso feito pelo processo em background DBWR. Portanto, toda manipulao dos dados d-se na memria principal, ou seja, na SGA. por isso que os dados precisam ser trazidos do disco para a memria antes de serem manipulados. Usamos dois termos para referenciarmos ao acesso aos dados: cache miss e cache hit. O termo cache miss usado para identificar as vezes que um processo experimenta acessar uma informao e o bloco que a contm precisa ser lido do disco. O termo cache hit usado para identificar as vezes que um processo encontra uma informao na memria.

Assim, um acesso atravs de um cache hit mais rpido do que atravs de um cache miss. Essa a forma bsica em que se processa o acesso aos dados, usando como exemplo um comando SQL para a atualizao de informaes em uma tabela: SQL> UPDATE emp 2 SET sal = sal * 1.1 3 WHERE ename = "SCOTT"; 1. O usurio emite um comando UPDATE, para atualizar a coluna SAL da linha identificada pela coluna ENAME="SCOTT" de uma tabela hipottica chamada EMP. 2. O comando emitido pelo usurio analisado e armazenado na SGA, na estrutura shared pool. 3. O processo servidor, criado quando o usurio faz a sua conexo com o ORACLE, efetua as leituras fsicas necessrias e traz os blocos de dados armazenados nos arquivos de dados para dentro da SGA, na estrutura database buffer cache. 4. Em seguida o ORACLE aplica a alterao definida no comando UPDATE nos blocos de dados que possuem a linha identificada por ENAME="SCOTT". 5. Sob certas condies, o processo em background DBWR escreve os blocos de dados alterados de volta para o arquivo de dados fsico apropriado. Esse processo em background o responsvel por essa tarefa. Ele simplesmente libera rea de memria do database buffer cache, j que a rea dessa estrutura limitada. Processos de usurios e processos servidores. Um processo de um usurio criado quando o usurio executa uma aplicao, ou seja, quando cria uma conexo com uma instncia. Nesse momento, o ORACLE cria um processo servidor dedicado que usado para executar as requisies do processo do usurio ao qual se associa. Portanto, um processo servidor comunica-se com um processo de um usurio, ou seja, sempre vai ser requisitado para executar qualquer comando. Entretanto, em algumas configuraes do ORACLE, um processo servidor pode ser compartilhado por diversos processos de usurios, isto , no vai ser utilizado para a conexo direta com qualquer processo de usurio; na verdade essa conexo d-se com a utilizao de outros processos. Portanto, nem sempre verdade que um processo servidor deve estar dedicado a um processo de um usurio. Basicamente, as funes de um processo servidor so:

1. Analisar e executar os comandos SQL. 2. Verificar se os blocos de dados encontram-se na estrutura database buffer cache. 3. Ler os blocos de dados dos arquivos fsicos no disco e lev-los para dentro do database buffer cache, na SGA. Essa operao somente feita se os blocos de dados a serem utilizados no se encontrarem em memria. 4. Retornar resultados dos comandos SQL para os processos dos usurios que os emitiram. Em um terminal dedicado em arquitetura multi-usurio, os processos dos usurios permanecem no servidor, assim como os processos servidores criados pelo ORACLE . Em arquitetura cliente-servidor os processos dos usurios permanecem na poro cliente, enquanto os processos servidores criados pelo ORACLE permanecem no servidor. Entretanto, para o ORACLE a forma de acesso independe da arquitetura utilizada, pois as estruturas na SGA, os processos e os prprios arquivos fsicos so basicamente os mesmos. A estrutura shared pool e seus buffers. A estrutura de memria compartilhada chamada shared pool contm informaes usadas para executar os comandos SQL. formada pelos buffers denominados shared SQL, data dictionary cache e sequence cache. Os buffers identificados como shared SQL areas contm o seguinte: 1. O texto dos comandos SQL e PL/SQL. 2. A forma analisada dos comandos SQL e PL/SQL. 3. O plano de execuo para os comandos SQL e PL/SQL. O compartilhamento dos planos de execuo dos diversos comandos nas reas de comandos SQL compartilhados melhoram o uso da memria, uma vez que as definies dos comandos podem ser compartilhadas entre as diversas aplicaes. A memria tambm dinamicamente ajustada de acordo com o conjunto de comandos SQL que so executados e, como a fase de parse ou anlise resumida, o tempo de execuo de um comando pode diminuir consideravelmente. Por sua vez os buffers identificados como data dictionary cache contm: 1. Linhas com as informaes do dicionrio de dados. Finalmente, os buffers identificados como sequence cache contm:

1. Informaes sobre os geradores de nmeros seqenciais usados pelos usurios.Database buffer cache. A estrutura de memria compartilhada chamada database buffer cache contm cpias dos blocos de dados que so lidos do disco pelos processos servidores. Os buffers so compartilhados por todos os usurios conectados a uma instncia ORACLE. O tamanho dos blocos de dados determinado pelo parmetro DB_BLOCK_SIZE, especificado no momento da sua criao e no pode ser alterado a menos que o banco seja novamente recriado. O nmero de blocos lgicos em memria determinado pelo parmetro DB_BLOCK_BUFFERS. Esses dois parmetros configuram o tamanho do database buffer cache. Ele organizado em duas listas: a dirty list e a least recently used list (LRU). A dirty list uma lista que contm os blocos alterados que ainda no foram escritos em disco. A LRU uma lista que contm blocos do ORACLE que foram alterados pelos comandos dos usurios mas ainda no foram gravados em disco. Contm ainda blocos livres e blocos em uso. Assim, quando um processo servidor precisa ler um bloco de dados do disco para a memria, ele: 1. Pesquisa nas listas LRU e dirty list pelo bloco de dados desejado. 2. Caso esse bloco de dados no seja localizado, o processo servidor pesquisa a lista LRU em busca de um bloco livre. 3. Em seguida, o processo servidor move os blocos alterados encontrados na lista LRU para a dirty list, ou seja, movimenta-os para a lista de blocos alterados ainda no gravados nos arquivos de dados, de acordo com a localizao de cada um deles, durante o processo de pesquisa de um bloco livre. 4. Finalmente, o processo servidor efetua uma cpia do bloco de dados do disco para um bloco livre. 5. Esse procedimento termina quando o processo servidor localiza um bloco livre ou se um nmero especfico de blocos forem pesquisados sem encontrar um nico bloco livre. Se nenhum bloco foi encontrado, o ORACLE deve gravar os blocos alterados da dirty list para os arquivos em disco, para liberar espao em memria para os novos blocos de dados que precisam ser manipulados pelos comandos dos usurios. Operao envolvendo o comando SELECT.

Para uma operao que envolve o comando SELECT preciso que os blocos de dados que contm as linhas a serem retornadas, de acordo com o critrio de pesquisa, estejam em memria, no database buffer cache. So executados os seguintes passos: 1. A lista LRU pesquisada para que os blocos de dados necessrios sejam encontrados. 2. Caso no se encontrem em memria, o processo do servidor executa as leituras fsicas necessrias e traz os blocos para a memria. 3. Em seguida so feitas leituras lgicas em memria. Nenhuma tabela ocupa menos de dois blocos de dados. Portanto, quando uma certa informao armazenada em uma tabela requerida na memria, pelo menos dois blocos de dados so necessrios: um bloco de cabealho e outro bloco com os dados. Segmentos de rollback. Um segmento de rollback uma poro de um banco de dados que registra as aes das transaes dos usurios nos dados para que possam ser desfeitas sob certas circunstncias; um objeto usado para gravar os dados alterados pelos processos dos usurios. Cada banco de dados deve possuir pelo menos um deles. Um segmento de rollback usado para permitir a consistncia da leitura, recuperar um comando quando ocorre o dead-lock, recuperar uma transao at uma certa marca identificada por um SAVEPOINT, recuperar uma transao terminada por uma falha de processo de um usurio e desfazer todas as transaes pendentes durante a recuperao de uma instncia. Cada transao deve ser assinalada a um segmento de rollback. Isso pode ser feito automaticamente baseado em alguns critrios que o ORACLE possui, como pode ser feito manualmente pelos usurios atravs do comando: SQL> ALTER SYSTEM USE ROLLBACK SEGMENT rbs_<numero>; Onde: RBS_<numero> Nome do segmento de rollback. Operao envolvendo o comando UPDATE. Todas as operaes de atualizao de dados em um banco de dados envolvem os segmentos de rollback para permitir a consistncia da leitura, a recuperao das informaes e permitir que uma transao ou um comando sejam desconsiderados ou desfeitos.

So executados os seguintes passos: 1. Os blocos de dados da tabela a ser alterada, com as linhas que sofrero as alteraes, so trazidos para a memria. 2. Os blocos de um segmento de rollback so alocados na mesma estrutura database buffer cache. Nesse momento, o ORACLE aloca automaticamente um segmento de rollback disponvel ou algum especificado pelo comando ALTER SYSTEM USE ROLLBACK SEGMENT. 3. So feitos locks exclusivos nas linhas modificadas. 4. Os dados antigos so gravados em um bloco do segmento de rollback acionado anteriormente. Nele so armazenados tambm a identificao da transao do usurio que executou o comando UPDATE, o endereo da coluna com a especificao do bloco de dados acionado, a identificao do arquivo fsico e o nmero da linha e da coluna a serem alteradas em seguida. 5. As alteraes so aplicadas nas linhas da tabela em cada um dos blocos de dados que as armazenam. Caso o mesmo usurio que tenha executado um comando UPDATE pesquisar a tabela atualizada, ele enxergar sua alterao. Os outros usurios no a enxergaro, isto , lero apenas o valor antigo armazenado no segmento de rollback. Dessa forma mantm-se a consistncia de leitura. Naturalmente, quando o usurio que executou o comando UPDATE efetivar as alteraes com o comando COMMIT, todos os outros usurios passaro a enxergar as alteraes feitas, exceto se algum outro estiver executando uma operao em andamento com o comando SELECT. Consistncia de leitura. Durante todo o processamento de um comando SQL, o ORACLE mantm uma consistncia dos dados de uma tabela de acordo com o momento em que o comando for inicializado. Para o comando SELECT, o ORACLE marca o momento da sua execuo como o instante a partir do qual a consistncia de leitura mantida. A partir deste momento, quaisquer alteraes feitas em uma tabela por outros usurios no so enxergadas pelo usurio que emitiu o comando SELECT, at que os outros usurios que atualizaram a tabela terminem suas transaes, com os comandos COMMIT ou ROLLBACK. Todas as alteraes feitas so mantidas em segmentos de rollback alocados pelo ORACLE ou pelos prprios usurios. Para quem estiver lendo a tabela o ORACLE l os valores antigos no segmento de rollback apropriado, e no nos blocos de dados alterados.

A seguir apresentamos o funcionamento desse mecanismo: 10 h 00 min SQL> UPDATE EMP ...; s dez horas o usurio A executa o comando UPDATE mas no efetiva a alteraes. 10 h 01 min SQL> SELECT ... FROM emp; s dez horas e um minuto o usurio B pesquisa a tabela EMP. Ele no enxerga as alteraes feitas pelo usurio A. Do segmento de rollback que registrou a alterao do usurio A trazido o valor antigo s alteraes, ocorrendo a consistncia da leitura. 10 h 02 min SQL> COMMIT; s dez horas e dois minutos o usurio A efetiva sua transao. Como no existe nenhum processo de leitura em andamento e no foi utilizado comando SET TRANSACTION READ ONLY, os segmentos de rollback alocados so liberados. 10 h 03 min SQL> SELECT ... FROM emp; Finalmente, s dez horas e trs minutos o usurio B passa a enxergar as alteraes feitas na tabela EMP pelo comando UPDATE do usurio A, pois a transao foi terminada e efetivada com o comando COMMIT. Processo DBWR. O processo Database Writer (DBWR) gerencia o database buffer cache para que os processos dos usurios sempre localizem blocos livres para o processamento de seus comandos. Ele escreve todos os buffers alterados para os arquivos de dados, usando o algoritmo LRU para manter os blocos mais utilizados em memria. O DBWR adia ao mximo a escrita dos blocos alterados para a otimizao do I/O em disco, que uma das principais causas para a queda da performance de um banco de dados. O processo DBWR escreve os blocos alterados para o disco quando: 1. A dirty list ultrapassar um certo limite. Essa lista usada no database buffer cache e contm os buffers alterados. 2. Um processo pesquisar um nmero especfico de buffers na LRU sem encontrar um bloco livre. 3. Ocorrer o time-out, ou seja, quando um certo tempo limite for ultrapassado. Esse tempo limite geralmente de trs segundos.

4. Ocorrer um checkpoint. Configurao multi-threaded O ORACLE pode ser configurado em trs diferentes formas para variar o nmero dos processos de usurios que podem estar conectados em cada processo do servidor. Dedicated Server Um processo servidor dedicado manuseia as requisies emitidas por um nico usurio. Esse processo servidor criado quando ocorre a conexo de um usurio com o ORACLE. Multi-Threaded Server A configurao Multi-Threaded Server do ORACLE permite que diversos processos de usurios conectados a uma instncia possam compartilhar um conjunto de processos servidores disponveis. Esses processos servidores so fornecidos pelo ORACLE quando o usurio requisita um comando. Combined User/Server Process Nesta configurao os cdigos de uma aplicao e do ORACLE so combinados em uma nica tarefa. Essa configurao disponvel em alguns sistemas operacionais, como o VMS. Com a utilizao apropriada dessas configuraes, podemos eventualmente melhorar o desempenho do banco de dados. Por isso, nessa sesso discutiremos a arquitetura multithreaded, suas vantagens e a configurao do ambiente.Quando devemos usar? O uso do multi-threaded tem diversas vantagens em relao s outras configuraes. Com ele podemos reduzir o nmero de processos em execuo na instncia e, dessa forma, conseguimos aumentar o nmero de possveis usurios. O nmero de processos desocupados pode ser drasticamente diminudo e temos uma sensvel melhora no uso da memria. Somente em algumas situaes especiais devemos usar a configurao de servidores dedicados. Para a execuo de procedimentos em lote, com uma grande quantidade de comandos SQL e para nos conectarmos como INTERNAL (para fazermos o STARTUP, SHUTDOWN ou a recuperao do banco de dados, por exemplo), devemos usar os servidores dedicados. Tambm devemos faz-lo em algumas situaes incomuns envolvendo os dead-locks no ambiente multi-threaded. A arquitetura multi-threaded. A primeira caracterizada pela conexo dos usurios. Durante uma tentativa de conexo, um processo chamado LISTENER (que faz parte do SQL*Net verso 2) percebe a requisio e determina se o processo do usurio pode ou no usar um processo servidor compartilhado. Caso seja permitido, o LISTENER informa ao processo do usurio o endereo de um processo chamado despachante, ao qual permanecer conectado

enquanto durar a sua sesso. Quando o usurio requisita uma conexo dedicada, o LISTENER cria um processo servidor dedicado e o associa ao usurio. Essa facilidade somente possvel com a verso 2 do SQL*Net. As verses anteriores no suportam a facilidade do multi-threaded, ou seja, elas aceitam to somente as conexes a processos servidores dedicados. A segunda fase caracterizada pela emisso dos comandos SQL por parte dos usurios. Quando um deles emite qualquer comando, essa requisio recebida pelo processo despachante ao qual o usurio est conectado. Por sua vez, o despachante coloca a requisio em uma fila de requisies, ou fila de entrada, que se encontra na SGA. O primeiro processo servidor compartilhado que estiver disponvel obtm a requisio na fila de entrada e o processa. Ao trmino do processamento, o processo servidor coloca a resposta em uma fila de respostas, nica para o despachante ao qual o usurio estiver conectado. Finalmente, esse despachante retorna a resposta ao usurio original. A fila de entrada, que recebe todas as requisies dos usurios, nica na instncia e compartilhada por todos os despachantes. Essa fila do tipo FIFO, ou seja, primeiro-queentra-primeiro-que-sai (first-in-first-out). As filas de respostas so usadas para conter todas as respostas dos comandos SQL executados pelos processos servidores compartilhados. Cada um dos despachantes possui a sua prpria fila de respostas. O contedo da PGA e da SGA diferencia-se quando implementamos o uso dos processos servidores dedicados e compartilhados. A alocao de memria sem o multi-threaded, ou seja, na configurao convencional (dedicada), difere-se da mutlti-threaded por que, nessa, parte do contedo da PGA passa a residir na SGA; somente encontra-se originalmente na PGA um espao para a pilha, que contm as variveis usadas por um usurio. As informaes sobre as sesses dos usurios, que inclui dados sobre a segurana e o uso dos recursos do ORACLE, assim como as informaes sobre o estado dos cursores, passam a residir na SGA. Essa alterao na PGA e na SGA totalmente transparente para os usurios. Podemos especificar o montante de memria na SGA a ser alocada para cada usurio atravs dos profiles, que controlam o uso dos recursos banco de dados. A configurao do multi-threaded relativamente simples. Devemos inicialmente instalar e configurar o SQL*Net Verso 2. Sem a verso 2 desse produto ficamos impedidos de usar essa configurao. Nesse documento no abordaremos toda a configurao, entretanto apresentaremos, em seguida, os passos bsicos para configurarmos uma mquina servidora de banco de dados: Passo 1: Configurar e criar o processo LISTENER.

O LISTENER o processo que controla as conexes s instncias. Podemos ter vrios processos rodando em uma mesma mquina; entretanto apenas um j o suficiente, pois podemos configur-lo para suportar diversas instncias e diferenciados protocolos. Os tipos de conexes so determinados pelos protocolos usados pelos processos despachantes. Existe um arquivo especial, denominado LISTENER.ORA, que usamos para a configurao do LISTENER. Geralmente ele encontra-se no diretrio $ORACLE_HOME/NETWORK/ADMIN. Em alguns sistemas UNIX, esse diretrio default pode ser o /etc. Entretanto, podemos especificar qualquer diretrio que desejarmos; para isso configuramos a varivel de ambiente chamada TNS_ADMIN com o nome do diretrio desejado. Nesse arquivo texto (LISTENER.ORA) inserimos todas as informaes sobre a configurao do LISTENER. Abaixo, apresentamos um modelo: ################ # Exemplo do arquivo listener.ora ################ LISTENER = (ADDRESS_LIST = (ADDRESS = (PROTOCOL=TCP) (HOST=192.1.1.10) (PORT=1525) ) ) STARTUP_WAIT_TIME_LISTENER=0 CONNECT_TIMEOUT_LISTENER=10 LOG_FILE_LISTENER=listener.log SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (SID_NAME=sid1) (ORACLE_HOME=/usr/oracle) ) ) TRACE_LEVEL_LISTENER=0 Para criarmos o processo, usamos o utilitrio LSNRCTL: $ lsnrctl start Passo 2: Configurar os descritores de conexo.

Os descritores de conexo so usados para facilitar a conexo dos usurios. Eles so armazenados no arquivo TNSNAMES.ORA, que fica nos mesmos diretrios onde podemos encontrar o LISTENER.ORA. A seguir temos um exemplo: ################### # Exemplo do arquivo tnsnames.ora ################### sid1mts = (DESCRIPTION= (ADDRESS_LIST= (ADDRESS= (PROTOCOL=TCP) (HOST=192.1.1.10) (PORT=1525) ) ) (CONNECT_DATA= (SID=sid1) ) ) sid1dedic = (DESCRIPTION= (ADDRESS_LIST= (ADDRESS= (PROTOCOL=TCP) (HOST=192.1.1.10) (PORT=1525) ) ) (CONNECT_DATA= (SID=sid1) (SERVER=DEDICATED) ) ) Passo 3: Configurar e criar a instncia. Devemos fechar o banco e encerrar a instncia para em seguida colocarmos o banco no ar, usando o arquivo de inicializao com os seguintes parametros: MTS_DISPATCHERS="tcp,3", "ipc,2" MTS_MAX_DISPATCHERS=10 MTS_SERVERS=4 MTS_MAX_SERVERS=14

MTS_SERVICE=sid1 MTS_LISTENER_ADDRESS="(ADDRESS=(PROTOCOL=TCP)(HOST=gp.com)(PORT=152 5))" Registro das Transaes O ORACLE registra todas as alteraes feitas em um banco de dados na estrutura redo log buffer cache. Um processo em background denominado LGWR escreve as informaes desses buffers para o disco, sob certas circunstncias. Um outro processo em background conhecido como ARCH pode ser opcionalmente utilizado para armazenar as informaes sobre as alteraes feitas nos dados em outro dispositivo, sempre que um arquivo redo log for preenchido. Somente um arquivo redo log utilizado por vez, entretanto em um banco de dados podem existir diversos arquivos de redo log. O seu nmero mnimo de dois grupos, cada um deles podendo conter um ou mais arquivos. Redo log buffer cache. O redo log buffer cache uma estrutura de memria de uso circular que contm buffers ou conjuntos de blocos ORACLE com informaes sobre todas as alteraes feitas nos dados de um banco de dados. Essas informaes so armazenadas sob a forma de entradas de redo log e so usadas para recosntruir as informaes dos segmentos alterados, inclusive os segmentos de rollback. As entradas de redo log armazenam todas as alteraes feitas em um banco de dados dentro da estrutura redo log buffer cache. So usadas para reconstruir ou descartar as alteraes feitas nos dados quando uma recuperao for necessria, ou seja, armazenam a before image e a after image. Esses termos so usados para identificarmos os dados antes e depois de uma alterao. Em situaes especiais, podemos desejar no registrar as alteraes nos arquivos de log. Por exemplo, na criao de um ndice ou de uma tabela e na carga de dados atravs do SQL*Loader; nos comandos de criao de tabelas e ndices podemos usar a clusula UNRECOVERABLE. O tamanho dessa estrutura determinado pelo parmetro LOG_BUFFER. Comando UPDATE e o redo log buffer. Como vimos, todas as alteraes feitas nos dados so armazenadas como entradas de redo na estrutura redo log buffer cache. Assim, a operao de UPDATE envolve realmente os seguintes passos:

1. Os blocos de dados da tabela a ser alterada com as linhas que sofrero as alteraes so trazidos para a memria, para dentro do database buffer cache. 2. Os blocos de um segmento de rollback so alocados na mesma estrutura. Nesse momento, o ORACLE aloca automaticamente um segmento de rollback disponvel ou algum especificado pelo comando ALTER SYSTEM USE ROLLBACK SEGMENT. 3. So feitos locks exclusivos nas linhas a serem modificadas. 4. A imagem das informaes antes e depois das modificaes so acionadas para dentro do redo log buffer cache como entradas de redo log. 5. Os dados antigos so gravados em um bloco do segmento de rollback acionado anteriormente juntamente com a identificao da transao do usurio que executou o comando UPDATE, o endereo da coluna com a especificao do bloco de dados acionado, a identificao do arquivo fsico e o nmero da linha e da coluna a serem alteradas em seguida. 6. As alteraes so aplicadas nas linhas da tabela em cada um dos blocos de dados que as armazenam. Processo LGWR. O processo em background log writer (LGWR) escreve as entradas de redo log para o disco. Isso acontece quando: 1. Ocorre a efetivao de uma transao com o comando COMMIT. 2. A estrutura redo log buffer atinge aproximadamente 1/3 de seu tamanho. 3. O processo em background DBWR precisa limpar os blocos dos buffers para a ocorrncia de um checkpoint. 4. Ocorre o time-out. Em uma instncia existe somente um nico grupo de arquivos redo log sendo utilizado para a escrita das entradas de redo log, da memria para o disco, simultaneamente, assim como somente um processo LGWR ativo. Enquanto uma transao no for registrada em um arquivo redo log o COMMIT emitido no confirmado. Uma transao pode fazer com que outras transaes sejam tambm gravadas nos arquivos redo log (piggy-backed, brincadeira conhecida entre ns como cavalinho), quando so efetivadas simultaneamente. Quando um grupo for preenchido, ocorre o log switch, ou seja, o prximo grupo disponvel passa a ser utilizado. Caso o banco opere no modo ARCHIVELOG, podemos usar os parmetros LOG_ARCHIVE_BUFFER_SIZE e LOG_ARCHIVE_BUFFERS para melhorarmos a gravao dos mesmos para outro dipositivo.

Operao envolvendo o comando COMMIT. O comando COMMIT efetiva as alteraes feitas nos dados por uma transao, tornandoas permanentes. So executados os seguintes passos: 1. Um usurio emite o comando COMMIT para finalizar sua transao. 2. Um registro desse COMMIT colocado no redo log buffer. 3. O processo em background LGWR grava as entradas de redo log dos buffers para o arquivo redo log correntemente em uso, se possvel usando uma gravao multi-bloco. 4. O usurio notificado de que a transao foi efetivada. 5. Os locks nos recursos so liberados assim como os blocos do segmento de rollback alocados para a transao do usurio. Apesar de no fazerem parte do processo de COMMIT de uma transao, precisamos assinalar que os blocos de dados so marcados como alterados e os blocos do segmento de rollback so liberados ou marcados como reutilizveis e, eventualmente, o processo em background DBWR pode escrever os blocos de dados alterados do database buffer cache para os arquivos fsicos em disco. O processo LGWR registra permanentemente todas as alteraes nos dados feitas pelas transaes dos usurios, enquanto o DBWR adia ao mximo a escrita dos blocos alterados nas transaes para diminuir o I/O, ou seja, reduzir o tempo de processamento da gravao dos blocos de dados alterados que se encontram na estrutura database buffer cache para os arquivos fsicos em disco, melhorando, assim, a performance. O I/O um dos aspectos que causam os maiores problemas e deve ser melhorado. Os comandos COMMIT simultneos dos usurios fazem com que as entradas de redo log para suas transaes sejam gravadas juntas em uma nica operao de gravao fsica nos arquivos redo log. Alm do mais, ocorre somente uma nica operao de gravao de entradas redo log por transao, pois essa gravao ocorre no momento do COMMIT e esse comando termina uma transao lgica. O tamanho de uma transao no afeta o tempo necessrio para uma operao de COMMIT.

Potrebbero piacerti anche