SELECT COM MUITOS REGISTROS
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
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
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.
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 !!
Consulte a clausula LIMIT que verá que ela é muito interessante pra isso, eu mesmo já vi pessoas falando dela para esses tipos de problemas !!
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.
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
Opa!!!!
Beleza pessoal, valeu, me ajudaram muito. Com essas dicas já consigo me virar bastante.
Tks.
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