FIREBIRD: UMA ANÁLISE DE PERFORMANCE Tiago Gomes Fagundes1, Renato Stocco Bonatto2, Leacir Nogueira Bastos3, Brauliro Gonçalves Leal4 RESUMO: Avaliou-se a performance do gerenciador de banco de dados Firebird 1.5 ao executar 10 milhões de operações (insert, select e update). A duração média das operações unitárias (DOU) de insert, select e update foram iguais a 0,00260, 0,000191 e 0,00140s, respectivamente. As equações ajustadas para os valores da duração acumulada das operações (DOA) em função do número de operações (NOP) foram: insert – DOA=1294,6NOP, com R2=0,9997; select – DOA=95,717NOP, com R2=1,0; update – DOA=697,32NOP, com R2=0,9983. Operações de update e select requerem 52,8 e 7,5% do tempo que as de insert, respectivamente. Os resultados mostraram que o tempo acumulado das operações cresceu linearmente, portanto, o tempo de execução de uma operação não depende do número de operações já realizadas. PALAVRAS-CHAVE: banco de dados, fb++, sql, open source. INTRODUÇÃO Pode-se definir Banco de Dados como uma coleção de dados relacionados com uma estrutura regular, salvos em um computador de forma que um programa de computador possa consultá-los com algum propósito específico. Utilizados em muitas aplicações, bancos de dados abrangem praticamente todas as áreas da computação. Um banco de dados normalmente é mantido e acessado por um Sistema Gerenciador de Banco de Dados (SGBD). Um SGBD é um conjunto de software responsável pela organização, persistência e recuperação dos dados, cujo principal objetivo é gerenciar o acesso e a manutenção dos dados. Existem muitos SGBD’s, alguns livres outros comerciais. De maneira geral são equivalentes em relação as suas funcionalidades, e possibilitam, com algumas diferenças, um tratamento adequado dos dados. Muitos dos SGBD’s utilizam a linguagem padrão para consultas SQL, com ela ganha-se flexibilidade para se operar dados em SGBD’s. O Firebird é um SGBD de alta performance, disponível para 1 Graduando em Ciência da Computação pela Universidade Federal de Viçosa. Email: tiagofagundes@ gmail.com 2 Bacharel em Ciência da Computação pela Universidade Federal de Viçosa. Email: renatobonatto@ yahoo.com.br 3 Professor do Departamento de Informática da UFV, Ph.D in Computer Science. Email: [email protected] 4 Doutor em Engenharia Agrícola pela UFV 1999, Diretor Científico do Grupo Intec. Email: leal@ grupointec. com.br plataformas de 32 e 64 bits. É um software livre desde 2000. Foi baseado no código do InterBase da Borland. O Firebird possui diversos níveis de segurança, o que o torna extremamente confiável, além disso, ele é um banco de dados de manipulação simples, Ele é mantido por uma comunidade internacional de desenvolvedores mantida pela FirebirSQL Foudation [1]. Está em conformidade com os requisitos SQL-92 – ANSI (nível de entrada), com extensões próprias para gerenciamento de Generators, Triggers e Stored Procedures. O Firebird é um sistema gerenciador de banco de dados relacional (SGDBR) cliente/servidor que oferece muitas características do ANSI SQL-92, com versões para Linux, Windows e uma variedade de plataformas Unix. Oferece excelente concorrência, desempenho elevado e arquitetura de múltipla geração, permitindo manipular várias versões de registros em qualquer momento. Dessa forma, o objetivo deste trabalho é avaliar a performance do SGBD Firebird 1.5. MATÉRIAIS E MÉTODOS Foi criada uma tabela A, indexada, com os campos conforme descritos na Tabela 1, um generator e uma trigger associada ao campo A0 para torná-lo auto-incremento. Tabela 1 – Descrição da tabela A utilizada com seus campos e tipos. Campo A0 A1 A2 A3 A4 A5 A6 Tipo INTEGER NOT NULL Integer NUMERIC(15,2), Char(26) Varchar(26) Time Date Foi escrito um programa em C++ para realizar 10 milhões de operações (insert, select e update), divididas em 20 blocos de 500000 operações (a cada operação correspondeu um commit), Anexo 1. Utilizou um computador Intel Pentium 4, 2.8 Ghz, 1.0 Gb RAM, para executar o software e obter a duração das operações realizadas. RESULTADO E DISCUSSÃO A Tabela 2 apresenta a duração acumulada das operações (DOA) e a duração média da operações unitárias (DOU) por bloco de insert, select e update em função do número de operações (NOP). Os valores da DOA variaram de 1.187 a 25.625s; 95 a 1.912s; e 765 a 13.548s para as operações de insert, select e update, respectivamente. Por outro lado, os valores médios da DOU para as operações de insert, select e update, foram iguais a 0,00260; 0,000191; 0,00140, respectivamente. As figuras 1.a, 1.c, 1.e, mostram os gráficos da variação dos valores do DOA em função do número de operações insert, select e update, respectivamente. As figuras 1.b, 1.d, 1.f mostram os gráficos da variação dos valores do DOU em função do número de operações insert, select e update, respectivamente. As figuras 1.a, 1.c, 1.e, também apresentam equações ajustadas para os valores do DOA em função do número de operações; sendo DOA=1294,6NOP, com R2=0,9997, para operações de insert; DOA=95,717NOP, com R2=1,0 para a operação de select; e DOA=697,32NOP, com R2=0,9983 para a operação de update. Tabela 2 – Duração acumulada das operações (DOA) e a duração média das operações unitárias (DOU) por bloco de insert , select e update em função do número de operações (NOP). NOP ( 500000) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Média Inserções DOA DOU (s) (s/insert) 1187 0,00237 2421 0,00242 3710 0,00247 4947 0,00247 6318 0,00253 7662 0,00255 8971 0,00256 10343 0,00259 11690 0,00260 13022 0,00260 14360 0,00261 15633 0,00261 16929 0,00260 18243 0,00261 19537 0,00260 20820 0,00260 22093 0,00260 23307 0,00259 24449 0,00257 25652 0,00257 0,00257 Seleções DOA DOU (s) (s/select) 95 0,000190 191 0,000191 288 0,000192 384 0,000192 480 0,000192 576 0,000192 673 0,000192 769 0,000192 864 0,000192 960 0,000192 1055 0,000192 1150 0,000192 1245 0,000192 1340 0,000191 1435 0,000191 1530 0,000191 1626 0,000191 1722 0,000191 1816 0,000191 1912 0,000191 0,000191 Alterações DOA DOU (s) (s/update) 765 0,00153 1413 0,00141 2169 0,00145 2891 0,00145 3626 0,00145 4346 0,00145 5002 0,00143 5703 0,00143 6368 0,00142 7058 0,00141 7887 0,00143 8572 0,00143 9219 0,00142 9901 0,00141 10574 0,00141 11206 0,00140 11806 0,00139 12382 0,00138 12967 0,00136 13548 0,00135 0,00135 0,00250 0,00150 y = 95,717x R2 = 1 00 75 00 00 0 85 00 00 0 95 00 00 0 0,00020 2000 0,00019 0,00019 1500 0,00019 Duração (s) 1000 500 0,00019 0,00019 0,00019 0,00019 0,00019 0 50 00 00 15 00 00 0 25 00 00 0 35 00 00 0 45 00 00 0 55 00 00 0 65 00 00 0 75 00 00 0 85 00 00 0 95 00 00 0 0,00019 00 0 35 00 00 0 45 00 00 0 55 00 00 0 65 00 00 0 75 00 00 0 85 00 00 0 95 00 00 0 25 00 00 0 50 0 Núm e ro de ope raçõe s 00 00 0,00019 15 0 Duração (s) 00 0 (b) 2500 Núm ero de operações (c) (d) 16000 0,00180 14000 0,00160 y = 697,32x R2 = 0,9983 12000 0,00140 0,00120 Duração (s) 10000 8000 6000 0,00100 0,00080 0,00060 50 00 00 15 00 00 0 25 00 00 0 35 00 00 0 45 00 00 0 55 00 00 0 65 00 00 0 75 00 00 0 85 00 00 0 95 00 00 0 00 00 00 00 00 00 95 0 85 0 75 0 00 00 00 0 00 00 65 0 55 0 45 00 35 0 25 0 00 50 0 00 00 0,00000 00 00 0,00020 0 0 0,00040 2000 00 00 4000 15 0 Duração (s) 65 00 0 Núm e ro de ope raçõe s (a) Núm e ro de ope raçõe s (e) 55 00 50 00 Núm e ro de ope raçõe s 45 00 0 00 00 15 00 0 50 00 00 0,00000 00 25 00 00 0 35 00 00 0 45 00 00 0 55 00 00 0 65 00 00 0 75 00 00 0 85 00 00 0 95 00 00 0 0,00050 0 00 0,00100 5000 00 0 10000 0,00200 35 00 15000 25 00 0 Duração (s) 20000 00 0 25000 Duração (s) 0,00300 y = 1294,6x R2 = 0,9997 15 00 30000 Núm ero de operações (f) Figura 1 – Variação dos valores de DOA e DOU em função do número de operações insert (a, b), select (c, d) e update(e, f). Das três operações avaliadas a que apresentou maior tempo de execução foram as de insert, seguida pelas de update que, por sua vez exigiram mais tempo que as de select. Operações de update e select requerem 52,8 e 7,5% do tempo que as de insert, respectivamente. Embora todas as operações realizam acesso ao banco de dados, as de insert utilizam mais recursos computacionais uma vez que alteram substancialmente a estrutura do banco de dados, aumentando o número de registros e criando e atualizando índices. Update não aumenta o número de registros, porém podem alterar seus valores. Select, por sua vez, não alteram o banco. Conforme pode-se observar na figura1, os valores de DOA, variaram linearmente com NOP, para as três operações analisadas. O tamanho do banco de dados vazio era de 263 Kb, ao final das inserções o seu tamanho era de 1065529 Kb, sendo assim a média de Kbytes por registros e controles inerentes ao banco de dados foi de 0,1065266. CONCLUSÃO Avaliou-se a performance do SGBD Firebird 1.5 ao executar 10 milhões de operações (insert, select,update), cuja durações médias foram de 0,00260, 0,000191 e 0,00140s para insert, select update respectivamente. As equações ajustadas para os valores duração acumulada das operações (DOA) em função do número de operações (NOP) foram DOA=1294,6NOP, com R2=0,9997, para operações de insert; DOA=95,717NOP, com R2=1,0 para a operação de select; e DOA=697,32NOP, com R2=0,9983 para a operação de update. Operações de update e select requerem 52,8 e 7,5% do tempo que as de insert, respectivamente. O tempo acumulado das operações cresceu linearmente e, portanto, o tempo de execução de uma operação não depende do número de operações já realizadas. REFERÊNCIAS BIBLIOGRÁFICAS [1]. FirebirSQL Foudation. Disponível em: <http://www.firebirdsql.org/> Acesso em : 09 Set 2007. Anexo 1 – Resumo do código utilizado. //-------------------------------------------------------#include “fbDriver.h” #include “fbQuery.h” //-------------------------------------------------------#define NBLOCO 20 #define BLOCO 500000 //-------------------------------------------------------string itos( int x ) { char sz[22]; sprintf( sz, “%d”, x ); return sz; } //-------------------------------------------------------int main( void ) { time_t ini = time(NULL); int c; fbDriver *db = new fbDriver(); fbQuery *Query = new fbQuery(); db->Attach(”FB++”,”fb++”,”fb++.FDB”); Query->Open( db->status, db->db ); for( int k = 0; k < NBLOCO; k++ ) for( int i = 0; i < BLOCO; i++ ) Query->SQL(”insert into A (A1,A2,A3,A4,A5,A6) values(1,1.2,’aaaaa’,’aaaaa’, ‘11:11:11’,’23.09.2007’)”); c = 1; for( int k = 0; k < NBLOCO; k++ ) for( int i = 0; i < BLOCO; i++ ) Query->SQL(”select * from A where A0=”+itos(c++)); c = 1; for( int k = 0; k < NBLOCO; k++ ) for( int i = 0; i < BLOCO; i++ ) Query->SQL(”update A set A1=1, A2=1.2, A3=’aaaaa’, A4=’aaaaa’, A5= ‘11:11:11’, A6=’23.09.2007’ where A0=” + itos(c++)); Query->Close(); delete Query; db->Detach(); delete db; system(”pause”); return 0; } //------------------------------------------------------