SELECT COM MUITOS REGISTROS

M.SOTTI 21/12/2006 09:16:56
#191385
Olá Pessoal, bom dia!

Meu problema é o seguinte: tenho uma tabela numa base de dados SQl Server, com cerca de 32.000.000,00 de registros.

Eu preciso apresentar esses registros num grid (Access) a partir de uma consulta com parà¢metros. Quando rodo essa consulta, a quantidade de registros retornados é muito grande o que acaba travando a estação.

Alguém sabe de algum macete pra rodar isso????


Desde já agradeço

Miguel Sotti
ALMARTI 21/12/2006 09:19:06
#191386
Mas você precisa realmente exibir todos estes registros? Se sim, faça uma paginação. Um primeiro select busca os 10.000 primeiros registros. Se precisar ir adiante, busca os próximos 10.000 e assim por diante.
ESLEYSANCHES 21/12/2006 09:20:58
#191388
Ponha um LIMIT na consulta SQL ae se puxa de 50.000 em 50.000 entendes ?

Consulte a clausula LIMIT que verá que ela é muito interessante pra isso, eu mesmo já vi pessoas falando dela para esses tipos de problemas !!


ESLEYSANCHES 21/12/2006 09:22:08
#191390
De uma olhadinha sobre uma explicação da clausula LIMIT, está em Espanhol, mais da para entender né amigo ?


Cláusula LIMIT

LIMIT { count | ALL } [ { OFFSET | , } start ]
OFFSET start


donde count especifica el máximo número de registros a devolver y start especifica el número de registros a saltear antes de empezar a devolver registros.

LIMIT le permite recuperar sólo una porción de los registros que se generan por el resto de la consulta. Si se especifica un número límite, no se devolverán más registros que esa cantidad. Si se da un valor de desplazamiento, esa cantidad de registros será salteada antes de comenzar a devolver registros.

Cuando se utiliza LIMIT es una buena idea utilizar la cláusula ORDER BY para colocar los registros del resultado en un orden único. De otra forma obtendrá un subconjunto impredecible de los registros de la consulta --- tal vez esté buscando los registros del décimo al vigésimo, ¿pero del décimo al vigésimo en qué orden? Usted no conoce el orden a menos que utilice ORDER BY.

Ya en Postgres 7.0, el optimizador de consultas toma en cuenta a LIMIT cuando genera un plan de consulta, así que es muy factible que usted obtenga diferentes planes (abarcando diferentes criterios de ordenamiento de registros) dependiendo de los valores dados a LIMIT y OFFSET. Por lo tanto, utilizar diferentes valores para LIMIT/OFFSET para seleccionar diferentes subconjuntos del resultado de una consulta, provocará resultados inconsistentes a menos que usted se asegura un resultado predecible ordenando con ORDER BY. Esto no es un bug; es una consecuencia inherente al hecho de que SQL no establece ningún compromiso de entregar los resultados de una consulta en un orden en particular a menos que se utilice ORDER BY para especificar un criterio de orden explícitamente.

USUARIO.EXCLUIDOS 21/12/2006 09:27:10
#191393
Carinha, tive um problema desses com 1 milhão de registros e tive que paginar. Segue um codigo ASP e vc tenta adaptar ai:

  


'*****
'* Contar o Total de Itens depreciacaos da Pesquisa
'*****
If Not pbFlagErro then

'Abertura do Banco de Dados
Set cnSimape = Server.CreateObject("ADODB.Connection")
Set rsSimape = Server.CreateObject("ADODB.RecordSet")

cnSimape.Open Application("gsConexao")

'Configuração do RecordSet
psSQL = ""
psSQL = psSQL & "SP_ITE_CON0028 '" & psCodRegional & "', "
psSQL = psSQL & psUnidadeIte & ", "
psSQL = psSQL & psNatureza & ", "
psSQL = psSQL & psQualificacao & ", "
psSQL = psSQL & psEspecificacao & ", "
psSQL = psSQL & "1,'',''"

On Error Resume Next

rsSimape.Open psSQL, cnSimape

If Err.number <> 0 then
piContaErro = piContaErro + 1
psTabErro(piContaErro) = Err.Description
pbFlagErro = True
rsSimape.Close
End If

On Error Goto 0

If Not pbFlagErro then

If rsSimape("TotItem") = 0 then
pbSemRegistro = True
pbFlagErro = True
Session("giTotItedepreciacao") = 0
rsSimape.Close
Else
Session("giTotItedepreciacao") = rsSimape("TotItem")
rsSimape.Close
'Calcular o Total de Páginas
If Session("giTotItedepreciacao") > 0 then
'*****
'* Paginar para Navegação
'* (Calcular o Primeiro e Ultimo de cada página)
'*****
Session("giTotItePagina") = Int(Session("giTotItedepreciacao") \ Session("giTotLinha"))
IF Session("giTotItedepreciacao") Mod Session("giTotLinha") <> 0 Then
Session("giTotItePagina") = Session("giTotItePagina") + 1
End If

'Configuração do RecordSet
psSQL = ""
psSQL = psSQL & "SP_ITE_CON0028 '" & psCodRegional & "', "
psSQL = psSQL & psUnidadeIte & ", "
psSQL = psSQL & psNatureza & ", "
psSQL = psSQL & psQualificacao & ", "
psSQL = psSQL & psEspecificacao & ", "
psSQL = psSQL & "2,'',''"

rsSimape.Open psSQL, cnSimape, 2

piContaPagina = 0

Do While Not rsSimape.EOF
piContaPagina = piContaPagina + 1

'Definir o Primeiro da Página
Session("gsPrimeiroIte" & piContaPagina) = rsSimape("CodNatureza") & rsSimape("CodQualificacao") & rsSimape("CodEspecificacao") & rsSimape("Sequencial") & rsSimape("Plaqueta")

'Procurar pelo Ultimo da página
rsSimape.Move(CInt(Session("giTotLinha")-1))

If Not rsSimape.EOF then
Session("gsUltimoIte" & piContaPagina) = rsSimape("CodNatureza") & rsSimape("CodQualificacao") & rsSimape("CodEspecificacao") & rsSimape("Sequencial") & rsSimape("Plaqueta")
rsSimape.MoveNext
Else
Session("gsUltimoIte" & piContaPagina) = "99999999999999"
End If
Loop
rsSimape.Close
Else
Session("giTotItePagina") = 0
End If
End If

End If
Set rsSimape = Nothing
Set cnSimape = Nothing
End If



M.SOTTI 21/12/2006 10:22:48
#191415
Opa!!!!

Beleza pessoal, valeu, me ajudaram muito. Com essas dicas já consigo me virar bastante.




Tks.
Tópico encerrado , respostas não são mais permitidas