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:

image01-2

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.