Teste de Desempenho: mysql, oracle, firebird 1.5, postgres
09/04/2009
Pessoal, gostaria de compartilhar com todos alguns testes que fiz de desempenho.
Para o teste foram realizados 1000 inserções em cada banco de dados 5 vezes consecutivas em uma tabela com 3 campos (1 - autoincremental, 2 - NOME(40 posições), 3 - ABREVIACAO (10 posições).
Tudo isto num mesmo programa, utilizando JAVA+JDBC. Então vamos aos assustadores resultados que obtive: A explicação disto...eu deixo para os mais experts...como eu disse...apenas relacionarei os valores obtidos.
Todos os testes foram feitas na mesma máquina e localmente, um notebook P4 2.4GHz com 512MB DDR SDRAM e HD 60GB 7.200rpm.
OBS: devido ao tempo...apenas testei INSERÇÕES (comando insert).
Os bancos testados foram: Mysql(3.23), Oracle(9.2.0.1), Firebird(1.5), Postgres (Versão Beta for Windows)
Mysql - Inserindo apenas um registro:
320ms
293ms
301ms
290ms
300ms
-------
300,8ms para inserir apenas um registro
Mysql - Inserindo 1000 registros:
681ms
691ms
701ms
731ms
701ms
--------
701ms para inserir 1000 registros
Oracle - Inserindo apenas um registro:
801ms
831ms
841ms
812ms
811ms
--------
819,2ms
Oracle - Inserindo 1000 registros:
5307ms
5598ms
5828ms
5408ms
5378ms
--------
5503,8ms
Firebird - Inserindo apenas um registro:
611ms
440ms
460ms
451ms
460ms
-------
484,4ms
Firebird - Inserindo 1000 registros:
14541ms
13069ms
13790ms
13018ms
13669ms
---------
13671,4ms
Postgres - Inserindo apenas um registro:
300ms
241ms
250ms
301ms
311ms
---------
280,6ms
Postgres - Inserindo 1000 registros:
31425ms
30914ms
30414ms
30614ms
30074ms
---------
30688,2ms
Bem pessoal, em resumo...as diferenças são assustadoras:
Mysql - 1o. lugar...leva menos que um segundo para 1 ou 1000 registros.
Oracle - 2o. lugar...leva menos que 6 segundos para 1000 registros...porém quase 1 segundo para 1 registro
Firebird - 3o. lugar...leva menos que 0.5 segundo para 1 registro e quase 14 segundos para 1000 registros
Postgres - 4o. lugar...leva menos que 0.3 segundo para 1 registro e quase 31 segundos para 1000 registros
Um abraço, a todos.
Arlei
Posts
O Mysql é o mais rápido na versão 3.23, mais isso não se repeta na versão 4x onde foram incluídas regras de integridade referencial.
Se eu fosse desenvolver um sistema hoje eu ainda utilizaria ou Postgres ou Firebird (o Oracle é caro!) porque oque eu já ouvi dizer de tabela estourada no Mysql não é brincadeira!!!!!
09/04/2009
Marcos Pereira
[quote="volnei"]O Mysql é o mais rápido na versão 3.23, mais isso não se repeta na versão 4x onde foram incluídas regras de integridade referencial.
Se eu fosse desenvolver um sistema hoje eu ainda utilizaria ou Postgres ou Firebird (o Oracle é caro!) porque oque eu já ouvi dizer de tabela estourada no Mysql não é brincadeira!!!!!
Eu tive que fazer um repair table numa mesma table duas vezes semana passada. Quantidade de registros? Menos de 100. Sobre os testes, eu gostaria de ver os codigos. Muita coisa influencia num teste desse, configurações do banco, maneira de se fazer a conexão, driver usado. Alem disso, creio que vc usou o System.currentTimeMillis() ao invés de um profile.
valeuz...
Caro Arlei,
Gostaria de você . Deixasse claro alguns itens:
1.1 como foram inseridos os 1000 registros 5 x consecutivas (isso não pode ser considerada uma mostra); usou ? insert into ?.
1.1 ? Como vc. colocou o campo auto increment (= generator ) no Firebird ????;
1.2 - Como vc. conseguiu que as ultimas inserções fossem piores que a primeira ???;
1.3 - Qual o tipo de driver JDBC você usou , o Oracle voa com uma JVM e driver tipo 4 .
1.4 - Qual o tipo de protocolo você usou, apesar de estar localmente tem que configurar TCP/IP + Host etc...
1.5 ? Nos campos da tabela usou ? char ou varchar ?, pois teremos que fazer ? select ?;
Se nós compararmos a consistência da estrutura de um verdadeiro ?SGDBR? em relação a um repositório de dados (= banco de dados ) veremos neste universo a assustadora diferença de resposta de ? select campo1, campo2 order by campo1 desc ? em uma base com 30/40 GB ou +++, isso sem contar os Stored procedure e Triggers, pois precisamos inserir, atualizar e excluir itens . Em suma cada ?SGDBR?, possui as suas qualidades, particularidades e superioridades, mais ele não trabalha sozinho depende de nós para criarmos o MER/DER/UML etc., ai sim colocaremos o time em campo para mostrar as nossas qualidades.
Abraços
William Silva
Pessoal...isto que postei, foi apenas um teste simples...quero deixar claro que tenho aplicações com quase todos os bancos de dados...com exceção do Oracle (devido ao preço). Então...fiquei curioso...e criei um script simples...idêntico para todos...usando insert into
Quanto ao campo auto increment...utilizei no caso do Firebird o get_id(generator,1)
e para o Oracle utilizei o sequenciador.nextval
para os outros...implementei no próprio sql...(no caso do postgres=apontei o sequence e mysql = autoincrement)
Naturalmente quanto a velocidade discrepante em relação a primeira inserçào...é que na primeira parte insiro apenas 1 registro por vez e na segunda insiro 1000 registros por vez...naturalmente...não sei explicar porque os bancos responderam diferente...pois para registrar apenas um registro no Firebird leva na média 484,4ms e para registrar 1000 registros leva a média de 13617,4ms...então na segunda forma o tempo médio para a inserção de 1 registro foi de 13,61ms...bem mais rápido que na primeira forma...provavelmente algum lance de cache do próprio servidor...etc...
Quanto aos drivers...todos jdbcs atuais...com exceção do Oracle...que tb nao deixa de ser atual: v. 9.2.0.1
Protocolo...tcp/ip.....porém...todo acesso local !
Nos campos usei Varchar.
Em breve, farei mais testes...aí postarei para vcs !!!
[quote="William Silva"]Caro Arlei,
Gostaria de você . Deixasse claro alguns itens:
1.1 como foram inseridos os 1000 registros 5 x consecutivas (isso não pode ser considerada uma mostra); usou ? insert into ?.
1.1 ? Como vc. colocou o campo auto increment (= generator ) no Firebird ????;
1.2 - Como vc. conseguiu que as ultimas inserções fossem piores que a primeira ???;
1.3 - Qual o tipo de driver JDBC você usou , o Oracle voa com uma JVM e driver tipo 4 .
1.4 - Qual o tipo de protocolo você usou, apesar de estar localmente tem que configurar TCP/IP + Host etc...
1.5 ? Nos campos da tabela usou ? char ou varchar ?, pois teremos que fazer ? select ?;
Se nós compararmos a consistência da estrutura de um verdadeiro ?SGDBR? em relação a um repositório de dados (= banco de dados ) veremos neste universo a assustadora diferença de resposta de ? select campo1, campo2 order by campo1 desc ? em uma base com 30/40 GB ou +++, isso sem contar os Stored procedure e Triggers, pois precisamos inserir, atualizar e excluir itens . Em suma cada ?SGDBR?, possui as suas qualidades, particularidades e superioridades, mais ele não trabalha sozinho depende de nós para criarmos o MER/DER/UML etc., ai sim colocaremos o time em campo para mostrar as nossas qualidades.
Abraços
William Silva