Total de registros de uma recordset

18 respostas
P
Statement stmt = conn.createStatement();

ResultSet rset = stmt.executeQuery(select nome from algo_tst);

// Print the name out

String s_rcount;

s_rcount = ?;// numero de registros retornados

como é?

18 Respostas

T

Normalmente você percorre o recordset para contar quantos registros, ou então usa uma query como “SELECT COUNT(*)”.

Problemas do SELECT COUNT(*):

  • Alguns bancos (como o SQL Server) processam SELECT COUNT(*) muito devagar.
  • Se você tem algo como:
    SELECT COUNT () WHERE cond
    alocar um array contendo os N registros necessários
    SELECT ____ WHERE cond
    você (a menos que use uma transação) pode ter um caso em que entre o SELECT COUNT(
    ) e o SELECT____ para recuperar os dados aconteça de a contagem ser alterada no pequeno espaço de tempo da alocação do array, obtendo menos ou mais linhas que o esperado.

Percorrer o recordset e contar quantos registros é melhor, basta usar um ArrayList em vez de um array para guardar os registros que foram lidos.

K

uma solução ruim mas funcional…

int numeroRegistros = 0;

while (resultSet.next()){
  numeroRegistros++;
}

resultSet.first();

percorre o resultset contando o numero de registro
e depois lhe tras para o 1o

valeu ? t+ :wink:

K

Diz a lenda que:

:arrow: SELECT COUNT(coluna_indexada) eh mais rapido do que SELECT COUNT(*).

:arrow: SELECT COUNT(1) eh melhor do que a opcao anterior.

Alguem sabe se isso procede?

Marcio Kuchma

P
int s_rcount;

rset.last();

s_rcount = rset.getRow();

rset.first();

isso ai num funciona naum???

A

Nao gosto muito da ideia de utilizar o “last()” e depois o “first()”, pq vc tem que abrir um resultset que suporte FORWARD E BACKWARD, o que nao eh tao bom pra performace qt os TYPE_FORWARD_ONLY…

Prefiro fazer um count dos registros no select !

Z

Se você tem um resultset muito pesado, não é uma boa alternativa iterá-lo todo, fazendo um contador, pra saber a quantidade de registros. Isso pode afetar muito o desempenho do seu sistema. Não sei se há muita diferença entre pecorrer o resultset todo e usar o método last().

Mas, por outro lado, nem sempre é possível criar uma nova consulta, do tipo “select count(*)…”, só pra saber a quantidade de registros.

Recomendo você fazer um teste antes, testando as alternativas. A que apresentar um menor custo pro sistema, você usa. :wink:

A

Perfeito!

Com dizem por aih… “Cada caso é um caso…”

L

Vc pode usar o metodo getFetchSize() para retornar o tamanho do resultset.

Isso so funciona se o driver que vc esta usando tiver esse metodo implementado. Nada como exerimentar!

S

Nonon … o fetchsize só diz quantos registros o recordset traz do banco a cada requisição … nao tem necessariamente a ver com a quantidade de registros do result.

K

só ressaltando é uma solução ruim mas funcional a que eu passei…
valeu ? t+ ai… :wink:

S

Em sistemas que eu preciso saber quantos registros tenho em cada tabela, eu costumo criar outra tabela com tais dados. Eh uma dor de cabeca pro desenvolvedor pq eh mais inserts e deletes no codigo, mas a longo prazo traz menos dor de cabeca e eu acho a gambiarra mais bonita de todas hehehe.

A

:shock: Eh :roll:

Digamos q vc tenha uma tabela de 10 Milhoes de registros e quer selecionar 1 Milhao… Vc seleciona os dados desta, deleta os da tabela temporaria, insere seus 1 Milha de registros lah e conta qts tem??

Alem disso, como vc garante concorrencia? Tipo, 2 carinhas rodando o programa ao mesmo tempo? Vc criou uma chave na “tabela temporaria” pra fazer saber de qual processo sao aqueles dados…

Nao entendi muito bem a solucao nao …

P

puxa vida!
que polêmica!!!

em questão à minha sujestão e a sujestão do alce ai…
eu acho que deve dar quase no mesmo… pois o programa deve colocar todos os dados em buffer…
a sujestão e técnica do kra que cria tabelas parece boas,
assim esta tabela pode ainda ser usado pra gerar sequencies, deixando toda regra , inclusive a de geração de sequencies no programa…[embora não seja tão válido assim pra relacionamentos]

quando eu tenho uma tabela de fatos e uma de detalhes, isso não funciona…
receio que eu tenha que buffetizar todos os dados da tabela só pra saber quandos registros tem…


eu tentei um tal de

getArray(1).getLength();
mas deu erro…

pode ser que esta seja uma boa solução…
alguem me ajuda a implementar essa lógica?!
ou se não for tão boa…
me avisem

K

Pronto. Isso aqui resolve. Se voce tem que iterar pelo ResultSet para fazer alguma coisa com ele que NAO seja exibir diretamente (o que geralmente eh o mais “correto”), aproveite e va incrementando um contador. No final voce tem o buffer/lista/etc e o contador prontinhos para uso. Sem dor-de-cabeca.

IMHO, o recurso de verificar a quantidade de linhas no ResultSet sem ter que percorre-lo poderia ser obrigatorio na especificacao do JDBC. Nao parece ser tao dificil fazer o driver JDBC devolver essa informacao. :smiley:

Marcio Kuchma

P

eu não falei deve no sentido de VAI TER QUE COLOCAR, e sim deve no sentido de INFELIZMENTE VOU GASTAR MEMORIA!!

SACOU?!

K

proteus_adi:
eu não falei deve no sentido de VAI TER QUE COLOCAR, e sim deve no sentido de INFELIZMENTE VOU GASTAR MEMORIA!!

SACOU?!

Nao. O que voce quer fazer?

  1. Apenas saber a quantidade de registros. Use SELECT COUNT.

  2. Puxar os dados e saber a quantidade de registros. Faca o SELECT normalmente, jogue numa lista e no processo incremente o contador. Voce nao ia jogar numa lista? Ia passar diretamente para a view sem intermediarios? Se sim, entao realmente nao ha como. Faca um SELECT COUNT antes do SELECT normal.

Quanto a armazenar a informacao em outra tabela, nesse caso acaba dando mais trabalho pois pra saber a quantidade voce vai ter que fazer um SELECT de qualquer jeito (exceto se fizer algum join exdruxulo com a tabela da consulta principal). E ainda tem o trampo da manutencao dessa tabela auxiliar.

Nao ha ainda a solucao ideal.

Marcio Kuchma

P

no site da sun eu achei isso:

If your JDBC driver allows it, and assuming your ResultSet is an instance variable:

private int getResultsCount() throws SQLException {

_rs.last();

int numResults = _rs.getRow();

_rs.beforeFirst();
return numResults;

}

P

ei!!!
como é que eu faço!!!
tá dando erro!!!
que parametros eu tenho que passar…

Criado 29 de novembro de 2004
Ultima resposta 1 de dez. de 2004
Respostas 18
Participantes 9