CONFIGURAÇÃO
As configurações que irei detalhar a seguir são as rotineiras, se você usa o Firebird e não configura ele é muito provável que o rendimento do banco esteja muito subestimado, isto ocorre porque a configuração padrão do Firebird é bem minimalista guardando valores que vêm desde o Interbase quando o Windows 95 ainda era chamado de sistema operacional vigente. Recomendo fortemente que reveja suas configurações lendo os tópicos abaixo.
DefaultTimeZone
O Firebird vem configurado com o timezone, execute:
sudo cat /opt/firebird/firebird.conf |ag DefaultTimeZone
E observe o resultado:
#DefaultTimeZone =
Quando essa linha está comentada ou vazia, o Firebird usa o timezone do sistema operacional ("OS time zone") — que, no seu caso, deve ser configurado corretamente no Linux e para você saber qual o timezone que está sendo usado, execute:
$ timedatectl
Local time: qua 2025-10-22 11:26:45 -03
Universal time: qua 2025-10-22 14:26:45 UTC
RTC time: qua 2025-10-22 14:26:45
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
No exemplo acima, estamos usando o timezone America/Sao_Paulo (-03, -0300). Se estiver errado, você corrige o sistema operacional ou então faz o ajuste necessário no firebird.conf.
TempDirectories
Forneça uma lista de pastas separadas por ';', onde os arquivos temporários serão armazenados. Caminhos relativos são tratados em relação ao diretório raiz do Firebird. O valor padrão é determinado usando as opções de ambiente FIREBIRD_TMP, TEMP ou TMP. Quando o primeiro diretório especificado não tiver espaço disponível, o mecanismo mudará para o próximo e assim por diante.
Alguns exemplos são mostrados no arquivo de configuração, veja:
sudo cat /opt/firebird/firebird.conf |ag TempDirectories
E observe o resultado:
# TempDirectories = c:\temp
# TempDirectories = c:\temp;d:\temp
TempDirectories =
Quando essa linha está comentada ou vazia, o Firebird usa o padrão do sistema operacional, no linux, será /tmp, se você indicar mais uma pasta ou ponto de montagem, tenha certeza de usar chmod 1775 nela.
RemoteAuxPort
O número da porta TCP a ser usado para mensagens de notificação de eventos do servidor. O valor 0 (Zero) ou ausente significa que o servidor escolherá um número de porta aleatoriamente, e é exatamente assim que vem configurado, veja:
sudo cat /opt/firebird/firebird.conf |ag RemoteAuxPort
E observe o resultado:
#RemoteAuxPort = 0
Não é boa ideia deixar usar uma porta aleatória, recomendo que troque pelo número da porta padrão+1, se a porta padrão for 3050 então use 3051. Usando dessa forma você sabe exatamente o que liberar no firewall.
WireCrypt
Encripta a conexão entre o lado cliente e o servidor. Ele é mandatório caso o servidor esteja numa comunicação http/https. Linguagens como php ou node requerem encriptação.
- Required estabelece que apenas clientes com essa opção habilitada poderão se comunicar com este servidor.
- Enabled estabelece que haverá encriptação, mas apenas se o lado cliente também tiver essa opção.
- Disabled estabelece que não haverá encriptação.
Exemplo para ajuste no firebird.conf:
WireCrypt = Enabled # (Required, Enabled or Disabled)
WireCompression
O parâmetro WireCompression define se os dados transmitidos entre cliente e servidor serão compactados antes do envio pela rede. Para que a compressão funcione, ambos os lados (cliente e servidor) precisam ter essa opção ativada.
Exemplo para ajuste no firebird.conf:
WireCompression = false
Quando ativada (true), os pacotes de dados trafegam comprimidos, o que reduz o volume de transferência e pode melhorar o desempenho em conexões lentas ou com alta latência (como VPNs, links ADSL ou conexões remotas). Por outro lado, em redes locais rápidas (LAN), a compressão pode piorar o desempenho, pois o tempo gasto para compactar e descompactar os dados supera o ganho de velocidade na transmissão — especialmente se uma das pontas for um computador com CPU limitada.
DefaultDbCachePages
O parâmetro DefaultDbCachePages define quantas páginas de dados cada banco de dados pode manter em cache simultaneamente. Quanto maior esse valor, mais páginas o mecanismo reserva em memória RAM para acelerar o acesso aos dados.
Por padrão:
- SuperServer → 2048 páginas de cache por banco de dados.
- Classic/SuperClassic → 256 páginas de cache por conexão de cliente por banco de dados.
Para estimar o consumo de memória, basta multiplicar o número de páginas pelo tamanho de página configurado no banco de dados. Por exemplo, com páginas de 16 KB e cache padrão de 2048 páginas:
2048 páginas × 16 KB = 32.768 KB = ~32 MB de RAM por banco
Isso mesmo, o Firebird vem ajustado de fábrica com requerimentos menores que os mínimos dos dias de hoje.
Exemplo prático para ajuste no firebird.conf:
DefaultDbCachePages = 2048
Num servidor dedicado (onde só o sistema operacional e o Firebird estão rodando), podemos aumentar esse valor de forma proporcional à memória disponível. Suponha que o comando free -h retorne:
total usada livre compart. buff/cache disponível
Mem.: 1,9Gi 270Mi 1,6Gi 2,0Mi 205Mi 1,6Gi
Swap: 974Mi 0B 974Mi
Há cerca de 1,6 GB de RAM livre. Se quisermos usar 1 GB dessa memória para cache, basta calcular quantas páginas de 16 KB cabem em 1024 MB:
1.048.576 KB ÷ 16 KB/página = 65.536 páginas
Logo podemos ajustar assim no firebird.conf:
DefaultDbCachePages = 65536
DatabaseGrowthIncrement
O manual oficial do Firebird define este parâmetro da seguinte forma:
"Define a quantidade de espaço em disco pré-alocado em bytes. A pré-alocação de espaço em disco permite reduzir a fragmentação dos arquivos físicos e evitar falhas por falta de espaço. Com a pré-alocação habilitada, o mecanismo aloca 1/16 do espaço já utilizado por vez, nunca menos que 128 KB e nunca mais que DatabaseGrowthIncrement (padrão de 128 MB). Para desabilitar a pré-alocação, defina o valor como zero. Arquivos de sombra não são pré-alocados."
Em outras palavras, este parâmetro controla quanto espaço vazio o Firebird reserva antecipadamente dentro do arquivo de banco de dados, evitando que o sistema operacional precise expandir o arquivo em pequenos blocos, o que causaria fragmentação e perda de desempenho.
Por padrão, o valor é 128 MB, o que significa que, quando o banco estiver próximo de encher, o Firebird criará mais espaço livre — equivalente a 1/16 do tamanho atual, respeitando o limite mínimo de 128 KB e máximo de 128 MB.
Por exemplo, se o banco tiver 4 GB e crescer cerca de 100 MB por dia, ao atingir o limite ele expandirá apenas 128 MB (pois 4 GB ÷ 16 = 250 MB, mas o limite máximo é 128 MB). Isso significa que o arquivo precisará ser expandido novamente muito em breve — possivelmente todos os dias — e esse processo pode ocorrer em momentos inoportunos, impactando o desempenho.
Portanto, em ambientes de alta demanda ou crescimento contínuo, pode ser prudente aumentar o valor de DatabaseGrowthIncrement para reduzir a frequência dessas expansões. Por outro lado, se quiser permitir que o banco cresça conforme necessário, pode desabilitar a pré-alocação (definindo o valor como zero), deixando o sistema operacional gerenciar o crescimento automaticamente.
Exemplo para ajuste no firebird.conf (minha preferência):
DatabaseGrowthIncrement = 0
DummyPacketInterval
Provedores de internet (ISP) geralmente ajustam seus servidores para "queimar" conexões ociosas porque conexões abertas além de consumir recursos podem ser um risco à segurança.
Isso não é um problema para aplicações que acessam o banco de dados de forma "stateless", isto é, conectam ao servidor, consomem e desconectam. Porém, há aplicações que foram migradas do desktop para a nuvem que mantêm a conexão pelo tempo que o programa estiver em uso e aqui teremos um problema se o usuário levantar-se para ir tomar um café e ao voltar a conexão tiver sido derrubada por causa do tempo de ociosidade.
Para esse problema específico, o ideal é que aplicações desktops para a nuvem usassem "Remote Desktop Protocol" (RDP), isto é, ao invés de ter a aplicação no lado cliente, a aplicação e o banco de dados ficam numa rede remota e o lado cliente usa o RDP para usufruir do programa que está nessa rede remota. Isto pode ser feito usando programas como o Windows Terminal Server, TS Plus ou GoGlobal. Nos casos que o RDP não seja aceitável, a solução é manter as conexões ativas e impedir que artificialmente elas sejam derrubadas por tempo de ociosidade e para realizar isso você deve configurar este parâmetro DummyPacketInterval.
O DummyPacketInterval informa quantos segundos esperar em uma conexão de cliente silenciosa (ou dormindo) antes que o servidor envie pacotes fictícios para solicitar confirmação.
Exemplo para ajuste no firebird.conf:
DummyPacketInterval = 180 # 3 minutos
DataTypeCompatibility
A partir do Firebird 4.0, o mecanismo passou a oferecer novos tipos de dados, incluindo variações com fuso horário (UTC) e outros aprimoramentos de precisão. Esses tipos podem ser desconhecidos para clientes legados, causando incompatibilidade em aplicações mais antigas.
Por exemplo, no Delphi e Lazarus, o tipo TIMESTAMP até a versão 3.0 não incluía informação de fuso horário. Nas versões mais recentes do Firebird, o tipo equivalente (TIMESTAMP WITH TIME ZONE) passa a carregar essa informação, e como resultado não é mais reconhecido automaticamente como TDateTime, o que pode fazer com que componentes como TField ou TSQLQuery falhem ao ler ou converter o valor.
Esse mesmo problema pode ocorrer em outras linguagens ou drivers que ainda não implementaram suporte completo aos novos tipos do Firebird.
Para garantir compatibilidade com aplicações antigas, o parâmetro DataTypeCompatibility permite simular o comportamento de versões anteriores do Firebird, convertendo os tipos novos para formatos legados compreensíveis pelos clientes antigos.
Exemplo para ajuste no firebird.conf:
DataTypeCompatibility = 3.0
Atualmente, são suportados dois valores:
- 3.0 → Mantém compatibilidade com o Firebird 3.0.
- 2.5 → Mantém compatibilidade com o Firebird 2.5.
DeadLockTimeout
O parâmetro DeadLockTimeout define o tempo máximo (em segundos) que o mecanismo aguardará antes de detectar e resolver um deadlock (impasse) entre transações. Quando duas ou mais transações estão aguardando recursos bloqueados umas pelas outras, o Firebird detecta essa situação e encerra uma das transações para desbloquear o sistema.
Valores menores fazem com que deadlocks sejam detectados mais rapidamente, mas podem causar falsos positivos em sistemas com alta concorrência. Valores maiores permitem mais tempo para que as transações se resolvam naturalmente, mas podem deixar o sistema travado por mais tempo em caso de deadlock real.
Exemplo para ajuste no firebird.conf:
DeadLockTimeout = 10 # segundos
StatementTimeout
O parâmetro StatementTimeout define o tempo máximo (em segundos) que uma instrução SQL pode executar antes de ser automaticamente cancelada pelo servidor. Isso ajuda a prevenir que queries malformadas ou muito pesadas consumam recursos indefinidamente.
Este timeout pode ser configurado globalmente no firebird.conf ou sobrescrito por conexão usando o comando SQL SET STATEMENT TIMEOUT ou através de propriedades de conexão.
Exemplo para ajuste no firebird.conf:
StatementTimeout = 0 # 0 = desabilitado (padrão)
Para habilitar com um timeout de 30 segundos:
StatementTimeout = 30
ConnectionTimeout
O parâmetro ConnectionTimeout controla o tempo máximo (em segundos) que o servidor aguardará durante o estabelecimento de uma nova conexão. Em sistemas com alta carga, isso ajuda a prevenir que clientes fiquem aguardando indefinidamente enquanto o servidor processa outras requisições.
Este timeout se aplica tanto a conexões TCP/IP quanto a conexões locais (XNET).
Exemplo para ajuste no firebird.conf:
ConnectionTimeout = 10 # segundos
ConnectionIdleTimeout (Timeout de Sessão)
O parâmetro ConnectionIdleTimeout define o tempo máximo (em minutos) que uma conexão pode permanecer ociosa antes de ser automaticamente encerrada pelo servidor. Quando o timeout é atingido, o servidor fecha a conexão, faz rollback de transações ativas e fecha cursores abertos.
O valor padrão é 0 (zero), o que significa que não há timeout configurado. Clientes recebem o erro isc_att_shut_idle quando uma conexão ociosa é encerrada.
Este timeout também pode ser configurado por sessão usando o comando SQL SET SESSION IDLE TIMEOUT, que aceita valores com unidades de tempo (SECOND, MINUTE, HOUR).
Exemplo para ajuste no firebird.conf:
ConnectionIdleTimeout = 0 # 0 = desabilitado (padrão), valor em minutos
Para habilitar com timeout de 30 minutos:
ConnectionIdleTimeout = 30
ExtConnPoolSize e ExtConnPoolLifeTime
Estes parâmetros configuram o pool de conexões externas, que gerencia conexões do servidor Firebird para outros bancos de dados ou servidores (por exemplo, em stored procedures que acessam bancos remotos).
- ExtConnPoolSize: Define o número máximo de conexões ociosas mantidas no pool (faixa: 0-1000). O valor padrão é 0, o que desabilita o pooling. Valores maiores mantêm mais conexões prontas para reutilização, reduzindo a latência, mas consumindo mais recursos.
- ExtConnPoolLifeTime: Define o tempo máximo de vida (em segundos) de uma conexão ociosa no pool antes de ser encerrada. O valor mínimo é 1 segundo e o máximo é 24 horas (86400 segundos).
Estes valores padrão podem ser temporariamente sobrescritos usando o comando SQL ALTER EXTERNAL CONNECTIONS POOL, mas as alterações não persistem após reinicialização do servidor.
Exemplo para ajuste no firebird.conf:
ExtConnPoolSize = 10
ExtConnPoolLifeTime = 3600 # 1 hora
MaxParallelWorkers e ParallelWorkers
Estes parâmetros controlam a execução paralela de tarefas de manutenção como sweep e criação de índices (disponível no Firebird 5.0+).
- ParallelWorkers: Define o número padrão de processos worker paralelos para conexões de usuário. O valor padrão é 1, o que significa que não há paralelização. Este valor pode ser sobrescrito por conexão usando a tag
isc_dpb_parallel_workersno DPB (Database Parameter Buffer). - MaxParallelWorkers: Limita o número máximo de processos worker concorrentes para um determinado banco de dados e processo Firebird. Isso previne que o sistema seja sobrecarregado com muitas operações paralelas simultâneas.
As conexões worker são gerenciadas internamente pelo mecanismo. No SuperServer, elas aparecem como conexões leves do sistema, enquanto no Classic/SuperClassic aparecem como conexões regulares.
Exemplo para ajuste no firebird.conf:
ParallelWorkers = 2
MaxParallelWorkers = 4
LockMemSize
O parâmetro LockMemSize define a quantidade de memória (em bytes) alocada para a tabela de hash que gerencia os locks (travamentos) do banco de dados. Cada lock consome uma quantidade fixa de memória, e este parâmetro determina quantos locks podem ser mantidos simultaneamente.
Em sistemas com alta concorrência ou muitas transações simultâneas, pode ser necessário aumentar este valor para evitar que o sistema fique sem espaço para novos locks, o que resultaria em erros de travamento.
O valor padrão geralmente é suficiente para a maioria dos casos, mas em ambientes com muitas conexões simultâneas ou transações longas, pode ser necessário ajustá-lo.
Exemplo para ajuste no firebird.conf:
LockMemSize = 1048576 # 1 MB (valor em bytes)
LockHashSlots
O parâmetro LockHashSlots define o número de slots na tabela de hash usada para gerenciar locks. Um número maior de slots reduz colisões na tabela de hash e pode melhorar o desempenho em sistemas com muitos locks simultâneos.
O valor ideal depende do número esperado de locks simultâneos. Valores muito baixos podem causar muitas colisões, enquanto valores muito altos podem desperdiçar memória sem benefício significativo.
Exemplo para ajuste no firebird.conf:
LockHashSlots = 8191 # deve ser um número primo para melhor distribuição
MaxStatementCacheSize
O parâmetro MaxStatementCacheSize define o tamanho máximo (em bytes) do cache de statements preparados. O Firebird mantém statements preparados em cache para evitar recompilação desnecessária, melhorando o desempenho de aplicações que executam as mesmas queries repetidamente com diferentes parâmetros.
Valores maiores permitem que mais statements sejam mantidos em cache, o que é benéfico para aplicações com muitas queries diferentes. No entanto, valores muito altos podem consumir memória desnecessariamente se a aplicação não reutilizar muitos statements diferentes.
Exemplo para ajuste no firebird.conf:
MaxStatementCacheSize = 67108864 # 64 MB (valor em bytes)
OuterJoinConversion
O parâmetro OuterJoinConversion é uma melhoria do otimizador no Firebird 5 que transforma operações OUTER JOIN em INNER JOIN quando possível. Esta otimização pode melhorar o desempenho de queries simplificando as estratégias de join.
Quando o otimizador detecta que um OUTER JOIN pode ser convertido com segurança em um INNER JOIN (por exemplo, quando há condições que garantem que não haverá linhas nulas), ele faz essa conversão automaticamente, resultando em planos de execução mais eficientes.
Este parâmetro geralmente não precisa ser configurado manualmente, pois o otimizador faz essa conversão automaticamente quando apropriado.
OptimizeForFirstRows
O parâmetro OptimizeForFirstRows faz parte das opções de estratégia do otimizador do Firebird 5, representando uma abordagem alternativa à estratégia de otimização ALL ROWS. Este parâmetro permite que o otimizador escolha entre otimizar para retornar as primeiras linhas rapidamente versus otimizar para recuperação completa do conjunto de resultados.
Quando habilitado, o otimizador prioriza planos de execução que retornam os primeiros resultados mais rapidamente, o que é útil para aplicações que exibem resultados paginados ou que precisam de feedback rápido ao usuário.
Esta otimização pode ser especificada por query usando a cláusula OPTIMIZE FOR FIRST ROWS ou configurada globalmente.
TempCacheLimit
O parâmetro TempCacheLimit define o limite máximo (em bytes) de memória que pode ser usado para cache de operações temporárias, como ordenações e joins complexos. Quando este limite é atingido, o Firebird começa a usar arquivos temporários em disco para completar as operações.
Valores maiores permitem que mais operações sejam completadas em memória, o que é significativamente mais rápido que usar disco. No entanto, valores muito altos podem causar pressão de memória em sistemas com recursos limitados.
O valor ideal depende da quantidade de RAM disponível e do tamanho típico das operações temporárias em seu ambiente.
Exemplo para ajuste no firebird.conf:
TempCacheLimit = 67108864 # 64 MB (valor em bytes)
InlineSortThreshold
O parâmetro InlineSortThreshold altera os planos de execução de queries mudando a abordagem de métodos de ordenação SORT para REFETCH. Este parâmetro representa uma adição recente às opções de configuração do Firebird e permite otimizar como as operações de ordenação são realizadas durante a execução de queries.
Quando uma ordenação é pequena o suficiente (abaixo do threshold), o Firebird pode usar uma estratégia de ordenação inline que é mais eficiente em memória. Para ordenações maiores, o mecanismo usa métodos tradicionais de ordenação.
Ajustar este parâmetro pode melhorar o desempenho de queries com ordenações, especialmente em sistemas com memória limitada ou quando há muitas queries com ordenações pequenas.
Exemplo para ajuste no firebird.conf:
InlineSortThreshold = 1024 # valor em registros