Firebird e PostgreSQL são dois dos mais robustos bancos de dados open source existentes. Pode ser difícil determinar qual será o melhor para determinado projeto.
Neste post, eu fiz um teste de velocidade entre os dois bancos, usando o
JMeter .
Carreguei um volume considerável de dados do
OpenStreetMap para a massa de dados: mais de 75 milhões de pontos de latitude e longitude, e mais 6 milhões de vias/ruas da América do Sul.
Permita-me apresentar os oponentes:
PostgreSQL
O PostgreSQL possui o slogan "The most advanced Open Source database". É um banco de dados bastante completo e avançado. Sua instalação vem com o Pgadmin3 que é o cliente oficial para administração da base.
O PostgreSQL possui funcionalidades, algumas bastante exóticas, como tais:
- Alta disponibilidade e replicação.
- Full Text Search (FTS) com indexação.
- Backups incrementais contínuos, com possibilidade de restauração até uma linha de tempo anterior, se necessário.
- Foreign Data Wrappers (FDW), para a conexão com meios de dados externos.
- Criação de índices concorrentes, sem a necessidade de travar a tabela em produção (CREATE INDEX CONCURRENTLY).
- Suporte a funções e tipos de dados de XML e JSON. Permite indexar partes desses arquivos também.
- Suporte a funções e tipos de dados trigonométricos.
- Linguagens de programação no lado do servidor plugáveis.
Firebird
O slogan do Firebird é "The true open source database". (Esse slogan me parece uma zueira com o MySQL, que não é totalmente livre, hehehee).
As funcionalidades do Firebird denotam sua grande facilidade de uso e versatilidade:
- Três modos de servidor (SuperServer indicado para servidores menores), (Classic para cargas maiores), Embedded e SuperClassic. O formato dos arquivos de banco são os mesmos.
- Capacidade de rodar em modo embarcado, sem necessidade de um servidor. Isso é bastante usado em programas embarcados feitos em Delphi ou Lazarus.
- Boa retro-compatibilidade dos servidores com versões anteriores de arquivos. Facilitando a migração de versão do servidor.
- Backups incrementais, com o comando nbackup. (Mas eu acho menos eficientes que os do PostgreSQL).
O servidor
Eu utilizei um desktop com disco SATA e CPU AMD Athlon64, 4 cores e 4 GB de RAM. Linux Slackware64 14.1com kernel compilado.
O PostgreSQL versão 9.4.4, compilado com
-march=native -mtune=native -fPIC.
O Firebird SuperServer versão 2.5.4 compilado com -
march=native -mtune=native -fPIC.
Parâmetros
No postgresql.conf:
shared_buffers = 384MB
work_mem = 12MB
checkpoint_segments = 32
No firebird.conf
FileSystemCacheThreshold = 67108864
DefaultDbCachePages = 8192
(O Firebird possui uma documentação oficial muito fraca, foi difícil procurar na net como melhorar esses parâmetros).
A Carga de dados
Eu baixei o arquivo da América do Sul do site do OpenStreeMap. Após tentar entender o XML do arquivo, criei um programa para transformá-lo em CSV e ser carregado no PostgreSQL com o comando COPY.
Depois disso, criei os índices no PostgreSQL, e fiz o comando COPY novamente para gerar um arquivo TXT e carregar no Firebird usando uma tabela
external file desse arquivo TXT. Criei os índices no Firebird.
Minha impressão foi de que o PostgreSQL carregou bem mais rápido, tanto o arquivo texto como criou os índices. Infelizmesnte eu não anotei os tempos de cada um mas o PostgreSQL foi mais rápido.
Gráficos
Rodei os seguintes comandos, para cada thread:
- SELECT pela chave primária.
- INSERT na tabela de log.
- SELECT pela chave primária.
- SELECT por índice de inteiro.
Tempo médio gasto, com 10, 50 e 100 usuários.
Aqui vemos que o Firebird possui mais dificuldade de escalar à medida que o número de usuários aumenta.