Problema com Select

Galera meu problema é o seguinte… to como uma base de dados aki onde em uma tabela tenho mais de 1 milhão de registros.
Quando eu dou um select na tabela demora muito a trazer os resultados ou da erro antes de terminar.
Eu queria saber se alguém tem uma solução para esse problema, acredito que alguns ja tiveram essa experiência se puderem
me ajudar fikarei grato…

jweibe,

Precisavamos ver o select para ver o que está usando para trazer as informações e se é apenas de uma tabela que está buscando as informações e se for mais de uma tabalha seu os joins está certo.

Jhoni_Bravo é um select basico mesmo… não estou usando join nem nada…

SELECT * FROM arquivos_impressos obj WHERE data_envio between '13/03/2011 00:00:00' AND '30/03/2011 00:00:00' "

Ele traz as informções mais dai quando eu vou percorrer meu resultset pra jogar o resultado em um List<?> ai e que da o problema.

[quote=jweibe]Galera meu problema é o seguinte… to como uma base de dados aki onde em uma tabela tenho mais de 1 milhão de registros.
Quando eu dou um select na tabela demora muito a trazer os resultados ou da erro antes de terminar.
Eu queria saber se alguém tem uma solução para esse problema, acredito que alguns ja tiveram essa experiência se puderem
me ajudar fikarei grato…[/quote]

1 milhão de registros é uma tabela pequena hoje em dia mas um índice ajuda, não? Que índices você tem como primeira coluna a coluna data_envio ?

[quote=entanglement][quote=jweibe]Galera meu problema é o seguinte… to como uma base de dados aki onde em uma tabela tenho mais de 1 milhão de registros.
Quando eu dou um select na tabela demora muito a trazer os resultados ou da erro antes de terminar.
Eu queria saber se alguém tem uma solução para esse problema, acredito que alguns ja tiveram essa experiência se puderem
me ajudar fikarei grato…[/quote]

1 milhão de registros é uma tabela pequena hoje em dia mas um índice ajuda, não? Que índices você tem como primeira coluna a coluna data_envio ? [/quote]

a primeira coluna e o id…

Mais uma pergunta… e correto trazer uma grande quantidade de informações dessa e jogar em uma Lista?
fazendo da seguinte maneira.

while(rs.next()){
  Entidade e = new Entidade();

 lista.add(e);
}

Ja tentou fazer consulta com paginação? talvez isso resolva a lentidão e é algo muito recomendado para trabalhar com tabelas grandes.

Não sei qual é o seu banco de dados, só espero que não seja Oracle pq ele não tem suporte a paginação.

Mas vamos supor que vc esteja usando MySQL (Um ótimo BD), sendo assim o comando via MySQL seria assim:

SELECT * FROM Tabela LIMIT 1,10 // Limit - limita o número de registros a visualizar. Neste será visualizado do 10 registros apartir do índice 1.

Qualquer dúvida detalhe mais o seu problema ok!!
vlw!!

[quote=caio.ribeiro.pereira]Ja tentou fazer consulta com paginação? talvez isso resolva a lentidão e é algo muito recomendado para trabalhar com tabelas grandes.

Não sei qual é o seu banco de dados, só espero que não seja Oracle pq ele não tem suporte a paginação.

Mas vamos supor que vc esteja usando MySQL (Um ótimo BD), sendo assim o comando via MySQL seria assim:

SELECT * FROM Tabela LIMIT 1,10 // Limit - limita o número de registros a visualizar. Neste será visualizado do 10 registros apartir do índice 1.

Qualquer dúvida detalhe mais o seu problema ok!!
vlw!![/quote]

Cara ja tinha visto essa possibilidade, a respeito do banco estou usando SQL Server 2008.
O problema nao esta na consulta em sim… mais na hora de varrer meu ResultSet. tipow…
Na hora de recuperar o resultado da consulta.

Mas qual o trace do erro ?

@ INFO: Execute Query: SELECT * FROM arquivos_impressos WHERE data_envio between '13/03/2011 00:00:00' AND '30/03/2011 00:00:00'
Exception in thread "http-8080-1" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.util.Arrays.copyOf(Arrays.java:2882)
	at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: GC overhead limit exceeded
19/09/2011 15:14:29 javax.faces.event.MethodExpressionActionListener processAction
GRAVE: 'java.lang.OutOfMemoryError' recebido ao invocar escuta de ação '#{arquivosImpressosMB.selectByData}' para o componente 'j_idt16'
19/09/2011 15:14:29 javax.faces.event.MethodExpressionActionListener processAction
GRAVE: java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.nio.CharBuffer.wrap(CharBuffer.java:350)
	at java.nio.CharBuffer.wrap(CharBuffer.java:373)
	at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:138)
	at java.lang.StringCoding.decode(StringCoding.java:173)
	at java.lang.String.<init>(String.java:443)
	at net.sourceforge.jtds.jdbc.ResponseStream.readString(ResponseStream.java:293)
	at net.sourceforge.jtds.jdbc.ResponseStream.readNonUnicodeString(ResponseStream.java:274)
	at net.sourceforge.jtds.jdbc.TdsData.readData(TdsData.java:936)
	at net.sourceforge.jtds.jdbc.TdsCore.tdsRowToken(TdsCore.java:3007)
	at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2270)
	at net.sourceforge.jtds.jdbc.TdsCore.getNextRow(TdsCore.java:765)
	at net.sourceforge.jtds.jdbc.JtdsResultSet.next(JtdsResultSet.java:581)
	at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
	at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
	at br.inf.gentec.report.dao.api.ArquivosImpressosPersist.query(ArquivosImpressosPersist.java:108)
	at br.inf.gentec.report.facade.ArquivosImpressosFacade.selectByData(ArquivosImpressosFacade.java:25)
	at br.inf.gentec.report.manager.bean.ArquivosImpressosMB.selectByData(ArquivosImpressosMB.java:113)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:772)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

java.lang.OutOfMemoryError, se nao me engano, isso eh erro de memoria fisica do servidor, estourando a quantidade de memoria… minha dica seria usar paginacao mesmo.

Não só paginação como também verificar bem se não há algum código estourando memória na aplicação, caso tudo isso esteja bem, pesquise no google como tunnar a JVM aumentando o seu Heap de memória para suporta tal consulta na base de dados :smiley:

Obrigado a todos pelas respostas…
Seguinte… o meu ResultSet esta vindo com todos os resultados…
Quando eu percorro todo meu ResultSet e coloco pra imprimir somente o Id de cada linha… funciona normal:

while(rs.next()){
 System.out.println(rs.getLong(1));
}

Porém se eu percorro meu ResultSet e set os valores no meu Bean e adiciono o mesmo em uma lista da o erro acima
que postei

while(rs.next()){
 Entity en = new Entity();
 en.setId(rs.getLong(1));

 lista.add(en);
 en = null;
}

A pergunta eh, tem alguma outra forma mais eficiênte de se fazer percorrer o ResultSet e setar seu respectivos valores em um
Bean e posterior adiciona-lo a uma lista?

Nunca , nunca use o “SELECT * FROM” , ao invés do “*” utilize o campo da tabela, isso vai melhor o desempenho de sua query =)

De uma olhada, aqui explicar melhor pq não usar:
http://dev.gardenquestions.com/pt/question/what-is-the-reason-not-to-use-select

[quote=Milton Quirino]Nunca , nunca use o “SELECT * FROM” , ao invés do “*” utilize o campo da tabela, isso vai melhor o desempenho de sua query =)

De uma olhada, aqui explicar melhor pq não usar:
http://dev.gardenquestions.com/pt/question/what-is-the-reason-not-to-use-select [/quote]

Quanto ao SQL ta ok… por que minha tabela tem 9 colunas e eu necessito das 9 colunas…
Eu quero saber se existe uma forma mais eficiente de percorrer o ResultSet.