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 – 2=1,0; update – com R2=0,9997; select – 2=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 1 Graduando em Ciência da Computação pela Universidade Federal de Viçosa. tiagofagundes@ gmail.com 2 Bacharel em Ciência da Computação pela Universidade Federal de Viçosa. renatobonatto@ yahoo.com.br 3 Professor do Departamento de Informática da UFV, Ph.D in Computer Science. [email protected] 4 Doutor em Engenharia Agrícola pela UFV 1999, Diretor Científico do Grupo Intec. leal@ grupointec. com.br Email: Email: Email: Email: SGBD’s. O Firebird é um SGBD de alta performance, disponível para 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 R2=0,9997, para operações de insert operação de select update. 2=1,0 2=0,9983 para a para a operação de 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 ) 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 30000 0,00250 Duração (s) 20000 15000 10000 0,00200 0,00150 0,00100 5000 0,00050 0 0,00000 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 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 Duração (s) 25000 0,00300 y = 1294,6x R2 = 0,9997 Núm ero de operações (a) Núm ero de operações (b) 2500 y = 95,717x R2 = 1 0,00020 0,00019 0,00019 1500 0,00019 Duração (s) Duração (s) 2000 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 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 Núm ero de operações Núm ero de operações (c) (d) 0,00180 16000 14000 0,00140 Duração (s) 10000 8000 6000 0,00100 0,00080 0,00060 0,00040 2000 0,00020 0 0,00000 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 Núm ero de operações Núm ero de operações (e) 0,00120 4000 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 Duração (s) 12000 0,00160 y = 697,32x R2 = 0,9983 (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 2=0,9997, 2=1,0 para a operação de para operações de insert 2 select =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; } //------------------------------------------------------