Saudações a todos. Meu nome é Fabrício e sou desenvolvedor Delphi numa empresa do ramo de Telecomunicações do estado de SP. Utilizamos como SGBD o Interbase 7.5 que é acessado por aproximadamente 200 usuários diariamente. Após passarmos por alguns entraves de performance, fizemos um processo de consultoria com a Borland (na época), e fomos aconselhados a fazer uso de um importante recurso: o Sweep.
Introdução
O sweep é o mecanismo do Interbase que vasculha o banco de dados inteiro com a finalidade de liberar o espaço usado desnecessariamente por registros que não estão sendo utilizados pelo banco.
Ele pode ser disparado automaticamente ou manualmente.
Ele é automaticamente acionado quando a diferença entre a OAT (Oldes Active Transaction) e OIT (Oldest Interesting Transaction) é igual ao valor determinado no banco de dados para acionar o sweep (default - 20.000).
Porém, por questões de performance, recomenda-se deixar o sweep manual.
Comand line para o sweep:
gfix -sweep <CAMINHO_DO_BANCO> -user <USUARIO> -pas <SENHA>
Aplicação
Para facilitar ainda mais esta rotina, podemos criar um utilitário visual fazendo uso do componente IBConfigService presente no Delphi.
Faremos agora a construção deste aplicativo:
Com o Delphi 2007 aberto, vá ao menu File -> New -> VCL Forms Application para iniciar uma nova aplicação e em seguida monte um layout conforme a figura abaixo:
Componentes usados:
1 PageControl: paleta Win32
3 GroupBox: paleta Standard
4 Edits: paleta Standard
5 Labels: paleta Standard
1 BitBtn: paleta Additional
1 IBConfigService: paleta Interbase Admin
Dando 2 cliques no botão, escreva o seguinte código no seu evento OnClick:
with IBConfigService do
begin
Active:= False;
ServerName:= edtSweepServerName.Text;
Protocol:= Local;
DatabaseName:= edtSweepDatabaseName.Text;
Params.Values[''user_name'']:= edtUsuario.Text;
Params.Values[''password'']:= edtSenha.Text;
LoginPrompt:= False;
try
Active:= True;
Screen.Cursor:= CrHourGlass;
try
ShutdownDatabase(Forced,0); //por precaução, é dado um shutdown nas transações pendentes
SweepDatabase; //inicia-se o processo de Sweep
ShowMessage(''Processo concluído!'');
except
on e: Exception do
begin
Application.MessageBox(PChar(''Ocorreu o seguinte erro:'' + e.Message),
''Erro'', MB_ICONERROR);
end;
end;
finally
BringDatabaseOnline; //após o shutdown, ativa-se o banco novamente
Active:= False;
Screen.Cursor:= CrDefault;
end;
end;
Notas:
Note que o código é bem simples. Apenas passamos os parâmetros
necessários para o componente IBConfigService e antes de chamarmos a rotina do Sweep em si, damos um shutdown no
banco de dados, eliminando quaisquer transações pendentes nele. Esse procedimento é utilizado na empresa onde
trabalho, pois ao tentarmos utilizar o Sweep numa base de dados muito grande e com muitos usuários ativos, tivemos
problemas com performance e travamento do servidor Interbase.
Obrigado.