Total de registros de uma recordset

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 é?

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.

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:

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

int s_rcount;
rset.last();
s_rcount = rset.getRow();
rset.first();

isso ai num funciona naum???

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 !

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:

Perfeito!

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

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!

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.

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

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.

: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 …

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

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

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

SACOU?!

[quote=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?![/quote]

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

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;

}

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