terça-feira, novembro 27, 2007

Custo do acesso à base de dados

Costumo dizer que aceder à base de dados é como ir às compras, mais vale ir uma vez e trazer o carrinho cheio do que ir 2 vezes e voltar a casa 2 vezes para trazer 2 produtos. Com isto quero dizer que mais vale fazer um acesso à base de dados e trazer um tuplo tamanho familiar, do que ir nem que sejam só duas vezes à base de dados para trazer 2 valores.

5 comentários:

JP Antunes disse...

Discordo.
Como em tantas outras coisas, não hºa uma verdade definitiva quanto á carga de uma query "gigante" versus uma "carrada" de queries.
Pensa em locks (row e table) e em zombie processes e tablespace scans ....

Anónimo disse...

Isso depende. Porque has de trazer comida para uma familia de 4 pessoas se moras sozinho? Acabas por ter de realizar mais esforco e alguma da comida vai-se estragar de certeza :-)
Por isso e' que o JDBC tem metodos tipo setFetchSize(), para nao congestionares a rede com dados desnecessarios e nao ocupares a BD com I/O desnecessario.
E' claro que se tens uma familia de 4 pessoas, nao faz sentido ir comprar uma batata de cada vez... depende de situacao para situacao, nao acho que seja algo que possa ser generalizado.

Anónimo disse...

Isso é discutível!

Tudo dependerá do tipo de acessos que irás fazer. Se estamos a falar de eliminar um pedido ao fazer um pedido enorme penso que não vale a pena.

Irás ter uma transacção mais pesada (a nível de espaço em memória, processamento e leitura de disco).

Sinceramente, se estás a falar apenas de 2 transacções, penso que vale a pena fazer 2 transacções!

É claro que depende do número de "hits da base de dados" e a quantidade de informação que retiras em cada query.

De qualquer forma, em certas situações, a tua analogia é boa ;o)

Tiago Sousa disse...

Adoro quando gero discórdia :D, mas ainda bem pelo menos temos assunto para discutir.
Claro que quando digo trazer muita informação digo trazer muita informação útil, não informação que nunca vamos utilizar.
No meu caso em concreto que pode servir de exemplo, a chamada mais simples à base de dados demorava algo a rondar os 3ms, e no mesmo fio de processamento era chamada a BD mais de 10 vezes. Ao agregar toda a informação que precisava numa só chamada que demorava cerca de 4,2ms acho que tive um ganho substancial, e além disso é uma leitura logo estou a usar uma transacção que não bloqueia outras leituras.

Vlad disse...

Quando se vai ao super-mercado deve-se levar uma lista de compras. O mesmo se aplica a uma base dados. Conforme o que precisamos, assim trazemos.

E tal como num super-mercado não nos podemos distrair com as prateleiras cheias de tretas que não precisamos.

Gostei desta analogia do super-mercado... gostei gostei.