Contar registros num ResultSet

Bom dia pessoal !!
Como faço para saber quantos registros uma query retornou num ResultSet ?
Para quem conhece Delphi, seria algo como o método RecordCount de um TDataSet

Desde já, muito obrigado !

Ow tenta o método .getMetaData(), não tenho certeza se é o que você precisa. Flw

Depende do seu driver JDBC. Alguns aceitam normalmente o método getFetchSize() , retornando o número de resultados, mas alguns que trabalham com streams não tem essa capacidade de saber quantos registros serão retornados, ficando somente então a “solução técnica alternativa”: dar um moveLast() e depois um getRow() para saber quantos registros tem.

Até!

bom , ate onde eu lembro do tempo que eu usava jdbc, não existe um metodo que te retorne isso diretamente.
o metodo getFetchSize(ate onde elmbro) não retorna o numero de registros retornados pela consulta, mas sim o tamanho do fetch usado para retornar registros, como se fosse uma paginação. mas nao fui nos docs confirmar.
uma maneira de fazer seria como foi falado, ir para a ultima linha e pegar o indice dela. o unico problema é que se vc quiser ler o ResultSet novamente vc deve mover o ponteiro para o inicio do ResultSe novamente, mas para isso vc deve criar um ResultSet navegavel nas duas direções, o default é forward only, mas nem todos drivers implementam isso.
ou pegar o tamanho da consulta como falado acima e depois refaze-la para poder ler os registros.

[]'s

[quote=maquiavelbona]Depende do seu driver JDBC. Alguns aceitam normalmente o método getFetchSize() , retornando o número de resultados, mas alguns que trabalham com streams não tem essa capacidade de saber quantos registros serão retornados, ficando somente então a “solução técnica alternativa”: dar um moveLast() e depois um getRow() para saber quantos registros tem.

Até![/quote]

Correto, traz uma pequena quantia de registros e deixa em cache… para não carregar a memória!

Abraços!

Acredito que terás uma melhor performance se você fizer:

SELECT COUNT(*) FROM suatabela .... WHERE suacondicao;

Pegar a quantidade de registros e fazer uma paginação, economizando assim muito tráfego da rede.

SELECT seuscampos FROM  suatabela .... WHERE suacondicao LIMIT 0, qtd;

PS: Exemplo de limit é do MySQL, se for SQL Server, se não estou enganado, é SELECT TOP qtd …;

você até pode fazer uma classe que faça a paginação pra você, fazendo o COUNT e logo apos o select e te retornar o REsultSet certinho…

Ja deve ter algo assim, é so dar uma procurada.

Se você quiser implementar, manda bala, se precisar de ajuda, estamos aí :slight_smile:

Abraços

select count (*) em alguns bancos de dados é super-lerdo e "trava" sua tabela (como é o caso do MS SQL Server) enquanto a contagem está sendo feita, o que pode ser muito danoso ao desempenho de sua aplicação.

No mínimo você tem de usar algo como (se sua consulta original era "SELECT ID, NOME, ENDERECO, TELEFONE FROM TABELA WHERE NOME &lt "RODRIGO"), no caso do MS SQL Server:

select count (ID) from tabela where nome &lt "RODRIGO" WITH(NOLOCK)

Se você quer saber o número de registros em uma tabela, não em uma query (com WHERE e outras coisas), tal como:

select count (*) from tabela

no MS SQL Server é muito mais rápido usar isto aqui:

 SELECT rows FROM sysindexes WHERE id = OBJECT_ID('tabela') AND indid &lt 2

[quote=thingol]select count (*) em alguns bancos de dados é super-lerdo e "trava" sua tabela (como é o caso do MS SQL Server) enquanto a contagem está sendo feita, o que pode ser muito danoso ao desempenho de sua aplicação.
[/quote]

Eu estou acostumado com o MySQL, e é a mesma coisa (em questão de performance, claro) usar o COUNT(*) ou o COUNT(ID), mas acredito que o COUNT(ID) é bem melhor mesmo.

Mas a dica é válida, inclusive para mim :slight_smile:

Abraços

De fato, select count (*) normalmente funciona bem em bancos como o Oracle ou o MySQL. Mas, como disse, varia de banco para banco.

melhor que o select count(*) é o select count(1) afinal, vc quer contar linhas, não precisa envolver colunas :wink:

Mas o “1” não é um coluna? :shock:

É e não é. Ele é uma constante, que por acaso vai voltar como coluna no resultado. Isso gera uma pseudo-otimização, já que ao invés de fazer o fetch das colunas da tabela JÁ lida, você carrega um outro valor.
O ganho, se tiver, é imperceptível.

Até!

Entendi. Pensei que se referia-se a primeira coluna.

Valeu :smiley:

Realmente não sei o comportamento em outros SGBDs, mas no Oracle isso não é uma “pseudo-otimização”, afinal, é uma otimização, apesar de ser pequena.

Novamente, no Oracle há um ganho, obviamente pequeno, contudo como não há diferenças para o desenvolvedor escrever “count(*)” e “count(1)” eu prefiro o “count(1)”, assim consigo uma melhoria de performance sem esforço nenhum.

Mito! Até as versões 8 do Oracle, isso era correto, nas versões mais novas, o count(1) e o count(*) utilizam o mesmo processo e mesmo caminho.
Mais em:
http://www.thescripts.com/forum/thread64728.html
http://www.thescripts.com/forum/thread654029.html


http://www.freelists.org/archives/oracle-l/07-2004/msg00518.html

Esse mito já foi comentado no asktom.oracle.com, só que não achei a thread.

Caso queira tirar a limpo, veja Oracle Explain Plan.

Até!

eu havia lido lá no asktom que isso melhora a performance… mas não sabia que era apenas para versões inferiores à 8.

Agradeço a correção :wink:

Alguem saberia como seria essa busca com count em PostgreSQL ?

Me passem com resultset e tudo mais por favor

[quote=Regis Claus]Alguem saberia como seria essa busca com count em PostgreSQL ?

Me passem com resultset e tudo mais por favor

…[/quote]

Count é padronizado:

select count (*) from tabela