45 Maneiras de Acelerar o FB
45 Maneiras de Acelerar o FB
45 Maneiras de Acelerar o FB
Usuários: 81860
Artigos: 235
Dicas: 142
Downloads: 331
26 07 20
45 maneiras de acelerar o FB
Data da última atualização: 23/05/2016
A seguir temos uma lista de dicas de desempenho para o banco de dados Firebird, em diferentes áreas - desde hardware/sistema operacional, tuning da
configuração do Firebird até recomendações de otimização de SQL. Esta lista não é uma referência completa de como otimizar o Firebird, e assume que você
tenha noções básicas do funcionamento do SGBD, como planos de execução, gerenciamento de transações e estatísticas de desempenho das consultas.
Aplique essas dicas com cautela e verifique o efeito antes de coloca-las em produção.
A FireBase é parceira da IBSurgeon no Brasil, e oferece suporte na otimização de bancos de dados e recuperação de bases de dados corrompidas.
Deixe seu banco de dados em um drive SSD. O drive SSD fornece I/O randômica muito mais rápida do que os drives tradicionais. A I/O randômica é fator
crítico ao ler/gravar dados distribuídos em grandes bases de dados - a maioria das operações de bancos de dados fazem uso intensivo de I/O randômica.
2. Use RAID 10
Se você usa RAID1 ou RAID5, considere migrar para RAID10 – geralmente é 15-25% mais rápida.
3. Verifique a BBU
Se estiver usando um controlador RAID, verifique se ele tem uma Unidade de Bateria de Backup (BBU) instalada e operacional – alguns fornecedores não
fornecem BBU por padrão, ou enviam a bateria desconectada (para evitar descarga). Sem BBU, o controlador desabilita o cache de escrita, e a RAID funciona
de forma lenta, mais lenta do que os habituais drives SATA. Geralmente, pode-se verificar o status da BBU na ferramenta de configuração de RAID.
Se você estiver usando um controlador RAID com BBU (e o servidor tiver no-break), verifique se o cache está definido como write-back (não write-through).
«O write-back» permite cache de gravação.
Verifique os discos a procura de blocos defeituosos e outros problemas de hardware (incluindo superaquecimento). Problemas de hardware podem diminuir
significativamente o desempenho de I/O, e levar a corrupções de banco de dados.
Se você usar o Firebird 2.5 SuperServer com muitas conexões, experimente trocar para o SuperClassic ou Classic, pois eles escalam melhor usando todos os
núcleos da máquina.
Se estiver usando o Firebird 2.5 Classic ou SuperClassic, considere migrar para o Firebird 3 SuperServer, pois ele pode usar vários núcleos da máquna, com a
vantagem do cache compartilhado.
Aumente o tamanho do cache páginas (parâmetro DefaultDBCachePages) em relação ao valor padrão. Para o SuperServer, no Firebird 2.5, recomendamos
10.000 páginas, para o Firebird 3, no SuperServer – 50.000 páginas, para o Classic/SuperClassic – de 256 a 2.048 páginas. No entanto, não defina buffers
muito altos pois a sincronização de cache tem seu custo. Uma possível idéia de carregar todo o banco de dados na memória RAM, alocando um buffer alto,
não vai funcionar como esperado. Acesse os arquivos de configuração do Firebird pré-otimizados aqui: ib-aid.com/en/optimized-firebird-configuration/
Aumente o valor do parâmetro TempCacheLimit no firebird.conf – ele especifica o tamanho do cache temporário para ordenação. Os valores padrão são
demasiadamente baixos (8Mb para Classic e 64Mb para SuperServer). Use pelo menos 64Mb para Classic e 1Gb para o SuperServer e SuperClassic.
Novamente, use os arquivos de configuração otimizados (item #9).
Se você faz inserções ou atualizações de dados de forma intensiva (você pode verificar isso com HQbird MonLogger, para detalhes, consulte a página 60 do
Manual de utilizador do HQbird), e tiver no-break e replicação instalada de forma a proteger contra as falhas de hardware, considere desligar o forced writes,
aumentando a velocidade das operações de gravação em até 3 vezes.
Aumente o valor do parâmetro LockHashSlots para o CS e SC, do padrão 1009, para algum número primo maior (30011, por exemplo), diminuindo as filas do
mecanismo interno de controle de travas.
www.firebase.com.br/artigo.php?id=2920 1/5
26/07/2020 45 maneiras de acelerar o FB
13. Use o CPUAffinity para o SuperServer no FB 2.5
Se você usa o SuperServer 2.5, defina o parâmetro CPUAffinity para utilizar tantos cores quanto for o número de bancos de dados em uso: o SuperServer no
2.5 pode usar diferentes núcleos de CPU para processar solicitações para bases de dados diferentes.
Definir a primeira parte do parâmetro TempDirectory no firebird.conf para o disco mais rápido disponível – SSD ou RAM. Isso diminuirá o tempo de grandes
ordenações – por exemplo, quando um backup está sendo restaurado.
Armazene os backups de bases de dados em uma unidade física dedicada (RAID). Isso irá separar a leitura/escrita durante o backup, agilizando o processo e
diminuindo a carga na unidade principal. É especialmente importante quando são realizados backups enquanto há usuários trabalhando nos bancos de dados.
Mais detalhes sobre configuração de hardware podem ser encontrados no "Guia do Hardware Firebird".
Se você inserir ou atualizar mais de 25% dos registros de uma tabela, desative os índices para a tabela onde os registros são inseridos, e reative-os depois da
inserção/atualização. A operação de reconstrução de índices pode ser mais rápida do que atualiza-los constantemente.
Para acelerar as inserções e atualizações, use tabelas temporárias globais (GTT) para inserção em massa de grande volume de registros, transferindo depois
para a tabela permanente. Isso pode ser muito eficaz quando há necessidade de processar os dados antes do armazenamento definitivo na tabela persistente.
Defina a menor quantidade possível de índices nas tabelas que sofrem inserções/atualizações intensivas. Cada índice adiciona uma sobrecarga significativa nos
inserts, updates, e deletes e nas operações de coleta de lixo – pode haver de 3 a 4 leituras/gravações adicionais, quando um registro está sendo
inserido/atualizado/excluído/limpo para cada índice.
Muitas funções internas foram adicionadas nas versões mais recentes do Firebird, e oferecem funcionalidades anteriormente disponíveis apenas em bibliotecas
UDF. Substitua, sempre que possível, as UDFs por funções internas, pois geralmente rodam até 3 vezes mais rápido que as UDFs.
Usar transações readonly para operações que não alteram registros (ou seja, selects) com o modo de isolamento ReadCommited. Tais operações não
bloqueiam a coleta de lixo, e podem ficar abertas indefinidamente sem afetar o desempenho do banco de dados.
Use transações de gravações curtas (para operações INSERT/UPDATE/DELETE). Quanto mais curta, melhor. Transações curtas bloqueiam proporcionalmente
menos versões de registros, impedindo a coleta de lixo. Infelizmente, até mesmo uma única transação de longa duração (deixada aberta, por exemplo, pela
ferramenta de desenvolvimento) pode estragar todo o efeito benéfico das outras transações de curta duração. Monitore as transações de longa duração e
corrija os locais apropriados no código-fonte. Use a ferramenta HQbird DataGuard para receber alertas sobre a transação ativa mais antiga no banco de dados
Firebird (quais aplicativos a iniciou, o endereço IP, data/hora do seu início) e o HQbird MonLogger para ver a lista completa de tranções longas e suas
estatísticas de I/O. Além disso, verifique se seu componente de acesso permite o uso de cached updates.
Evite situações quando um registro tem muitas versões – o Firebird funciona muito mais lento com cadeias de registros muito longas. Para ver quantas
versões de registros estão presentes em algumas tabelas, e qual é a maior cadeia de registros, use o HQbird IBAnalyst, na guia Tabelas, e ordene pela coluna
"Max version". Pense em usar uma combinação de inserts e deletes agendados dos registros antigos, ao invés de várias atualizações de um mesmo registro.
Use instruções preparadas para executar consultas SQL onde apenas o valor dos parâmetros são alterados – por exemplo, certifique-se de preparar a query
antes do loop de tais consultas. A preparação pode levar um tempo significativo (especialmente para grandes tabelas), e preparando a consulta uma única
vez, aumentará significativamente o desempenho geral.
No caso de uma grande operação de INSERT/UPDATE/DELETE, não fique commitando a transação após cada operação (comum se você estiver usando a opção
de autocommit em seu componente de acesso) - faça o commit a cada 1.000 ou mais operações. Cada commit da transação executa várias leituras/gravações
no banco de dados, diminuindo o desempenho.
25. "Desligue" o uso de índices quando estiver usando IN com várias constantes
Se estiver usando a construção WHERE fieldX IN (Constant1, Constant2,… ConstantN), e houver um índice definido para o fieldX, o Firebird usará o índice
quantas vezes for o número de constantes na cláusula IN. Desative o uso do índice transformando fieldX em uma expressão do tipo WHERE fieldX+0 IN
(Constant1, Constant2,… ConstantN), ou, se o campo for do tipo string, use fieldX || ''.
Evite usar queries com IN aninhados, por exemplo WHERE IN(SELECT... WHERE IN (SELECT.. WHERE IN() )), pois pode confundir o otimizador. Transforme os
aninhamentos em JOINs.
Se estiver usando LEFT OUTER joins, liste os joins na sequência da menor tabela para a maior.
Procure limitar o número de registros retornados por um SELECT usando FIRST… SKIP ou ROWS. Se a query não é usada para relatórios (o que geralmente
requer recuperar todo o resultado), geralmente é suficiente retornar os 10-100 primeiros registros. Recupere apenas os registros necessários.
30. Use tabelas derivadas para otimizar SELECTs com ORDER BY / GROUP BY
Outra maneira de otimizar a consulta SQL com ordenação é usar tabelas derivadas para evitar operações de ordenação desnecessárias. Em vez de
Use o seguinte:
SELECT T.FIELD_KEY, T.FIELD1, T.FIELD2, ... T.FIELD_N FROM (SELECT FIELD_KEY FROM T ORDER BY FIELD2) T2 JOIN T ON T.FIELD_KEY = T2.FIELD_KEY
Para armazenar strings curtas, use VARCHARs. Para armazenar textos longos, use BLOBs. Varchars são mais rápidos para textos curtos pois eles ficam
armazenados dentro do registro, e o registro inteiro é lido em um único ciclo de I/O, e se o tamanho do registro for inferior a 2/3 do tamanho da página do
banco de dados, o registro todo é armazenado na mesma página. BLOBs são armazenados fora do registro, e exigem uma rodada adicional de I/O para lê-los,
mas mostram vantagens na leitura/gravação de strings longos.
Exclua colunas BLOB de SELECTs grandes. Recupere o conteúdo do blob posteriormente, somente quando for necessário (por exemplo, o usuário quer
recuperar um documento específico que está armazenada em um blob).
Use o tipo BIGINT para chaves primárias, auto-incrementos e identificadores em geral. Operações com BIGINT são as mais rápidas, e o BIGINT tem
capacidade suficiente para armazenar praticamente todos os intervalos de dados.
Não use VARCHAR para identificadores, a menos que seja realmente necessário – operações com eles são menos eficazes do que com as colunas de tipo
inteiro. Evite especialmente o uso de GUIDs como identificadores – devido a distribuição aleatória dos valores GUID, operações de INSERT/UPDATE com GUIDs
em chaves primárias/únicas podem ser 20 vezes mais lentas do que com números inteiros.
Recalcule as estatísticas dos índices regularmente. Atualize as estatísticas dos índices nas tabelas atualizadas frequentemente através do comando SET
STATISTICS, permitindo ao otimizador do Firebird escolher os melhores planos SQL. O HQbird DataGuard pode executar tal recálculo das estatísticas de
índices automaticamente, no horário desejado (geralmente uma vez por semana).
Se as conexões com o Firebird forem curtas (típico em servidores web), use pool de conexão – por exemplo, no PHP use a função ibase_pconnect em vez da
ibase_connect.
Se conexões de banco de dados são curtas e você estiver usando o Firebird 3, use a opção LINGER para manter o cache ativo durante um período específico
de tempo, fazendo com que as páginas permaneçam no cache, mesmo não havendo outra conexão. Por exemplo, ALTER DATABASE SET LINGER TO 60,
manterá o cache por 60 segundos após o término da última conexão.
No Firebird 3.0, quando juntar tabelas grandes e pequenas, HASH joins podem ser muito mais rápidos do que um join tradicional, que usa «loops aninhados»
com índices. Para fazer com que o otimizador do Firebird use HASH joins, use + 0 na condição de junção: T1 JOIN T2 ON T1.FIELD1+0 = T2.FIELD2+0. Teste
o resultado da otimização antes de colocá-la em produção!
Marque suas funções PSQL (no Firebird 3) que não tenham parâmetros e retornem valores constantes com a palavra-chave DETERMINISTIC. As funções
determinísticas são calculadas e armazenadas em cache, no escopo da consulta atual.
Se você estiver executando SELECTs que retornam dados de colunas e dados agregados, use as Window Functions – é mais rápido do que uma subconsulta ou
duas consultas. Por exemplo:
Select id, department, salary, salary / (select sum(salary) from employee) percentage from employee
Substitua por
Select id, department, salary, salary / sum(salary) OVER () percentage from employee
Use o gbak com o parâmetro -se para acelerar as operações de backup/restore em até 20%, por exemplo:
A maneira mais rápida de processar registros retornados por cursores PSQL é a cláusula WHERE CURRENT OF. É mais rápido do que where rb$db_key =
:v_db_key e muito mais rápido do que pesquisar com uma chave primária/única.
www.firebase.com.br/artigo.php?id=2920 3/5
26/07/2020 45 maneiras de acelerar o FB
Excelente
Costumo usar chave primaria como string formatada exemplo 000001 isso e mais lento que uma chave primaria inteira ?
Ótimas Dicas. Uma boa montagem do SQL combinado com o índice correto faz toda diferença
Carlos [31.01.17]
Simplesmente excelente .
Muito bom, em 10 anos de Firebird tem coisas que ainda não conhecia. :O
Huander [10.04.18]
Muito bom! Agora que uma ajuda, tentei usar o HASH JOINs, no entanto acabo recebendo um erro, "Strings cannot be added or subtracted in dialect 3".. Então o que
fazer mudar pra Dialect 1?
ótimo tópico...
Atualizado e conciso!!!
Muito bom!
Documentário excelente...
Copyright (c) Carlos H. Cantu - É proibida a reprodução de qualquer material desse site sem autorização prévia
www.firebase.com.br/artigo.php?id=2920 5/5
26/07/2020 45 maneiras de acelerar o FB
Não execute consultas em tabelas de monitoramento (MON$) muitas vezes – tais consultas consomem recursos significativos e podem diminuir
consideravelmente o desempenho. Recomendamos não executar consultas nas tabelas MON$ em intervalos menores que 1 minuto. Para monitoramento
contínuo do Firebird, use o HQbird PerfMon que suporta a TraceAPI (ver página 66 do Manual do utilizador de HQbird para obter detalhes).
Se você estiver executando muitos comandos DML (Insert/Update/Delete)em uma mesma transação, o Firebird mescla o undo-log de cada operação com o
undo-log da transação. Para acelerar essas operações DML em massa, inicie a transação com a opção NO_AUTO_UNDO, a fim de não mesclar o undo-log de
cada operação com o da transação.
Estabelecer uma conexão com autenticação SRP demora mais do que usando o método legado. No entanto, conexões SRP são mais seguras.
CONSIDERE QUE...
O maior impacto no desempenho do Firebird é causado por suas consultas SQL. Aprender a ler e analisar os planos de consulta é a chave para um melhor
desempenho. Você pode obter um curso online sobre otimização de consultas em ib-aid.com/firebird-training
Comentários
Ótimas dicas, no caso de quem usa Firebird com Delphi recomendo também ler bem a documentação e dicas disponíveis em relação aos componentes a serem
utilizados com as rotinas do banco de dados, sejam eles os de conexão quanto os DataControls, o FireDac e o IBO são oferecem ótimos componentes que muitas vezes
por "preguição" não são bem explorados pelos desenvolvedores.
muito bom
Maravilhoso
Show de bola!!!
Muito bom.
Ótimo...
Muito bom!
Excelente!