firebird: uma análise de performance

Propaganda
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,6NOP,
com R2=0,9997; select – DOA=95,717NOP, com R2=1,0; update –
DOA=697,32NOP, 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,6NOP, com
R2=0,9997, para operações de insert; DOA=95,717NOP, com R2=1,0 para a
operação de select; e DOA=697,32NOP, 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,6NOP, com R2=0,9997,
para operações de insert; DOA=95,717NOP, com R2=1,0 para a operação de
select; e DOA=697,32NOP, 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;
}
//------------------------------------------------------
Download