SELECT MAIS RAPIDO
                    Senhores,
TENHO UM PROJETO ONDE GERO UM AQUIVO TXT. EM ALGUMAS TABELAS QUE TEM MUITOS DADOS, DEMORA PARA COMEÇAR A GERAÇÃO.
ISSO ACONTECE ASSIM QUE ELE PASSA PELA LINHA QUE TEM O CÓ“DIGO (VERIFIQUEI ISSO COM F8):
rec.Open sSql, dbBanco, adOpenKeyset
NESTE MOMENTO ELE FICA CONTANDO OS REGISTROS.ENTÃO SE A TABELA TEM 50.000 REGISTROS, SÓ“ VAI COMEÇAR A GERAR O AQUIVO QUANDO TERMINAR DE CONTAR.
A PERGUNTA é: TEM ALGUMA FORMA DE AGILIZAR ISSO???
Vejam como está meu código:
                
            TENHO UM PROJETO ONDE GERO UM AQUIVO TXT. EM ALGUMAS TABELAS QUE TEM MUITOS DADOS, DEMORA PARA COMEÇAR A GERAÇÃO.
ISSO ACONTECE ASSIM QUE ELE PASSA PELA LINHA QUE TEM O CÓ“DIGO (VERIFIQUEI ISSO COM F8):
rec.Open sSql, dbBanco, adOpenKeyset
NESTE MOMENTO ELE FICA CONTANDO OS REGISTROS.ENTÃO SE A TABELA TEM 50.000 REGISTROS, SÓ“ VAI COMEÇAR A GERAR O AQUIVO QUANDO TERMINAR DE CONTAR.
A PERGUNTA é: TEM ALGUMA FORMA DE AGILIZAR ISSO???
Vejam como está meu código:
Private Function Exportar_Arquivo(ByRef sMsg As String) As Boolean
    Dim lContinua       As Boolean
    Dim sSql            As String
    Dim rec             As New ADODB.Recordset
    Dim sCNPJ           As String 
    Dim sNMCLIENTE      As String
    On Error GoTo Fim
    
    Arquivo.sArquivo = txtArquivo.Text
    
    lContinua = True
    
    If Trim(Arquivo.sArquivo) = "" Then
        sMsg = "Informe o Nome do Arquivo!"
    Else
        
       If Dir(Arquivo.sArquivo) <> "" Then
          lContinua = (MsgBox("Arquivo " + Arquivo.sArquivo & " já Existe. Sobrescrever?", vbQuestion + vbYesNo, Me.Caption) = vbYes)
       End If
      
       If lContinua Then
          sSql = "Select * from Clientes " 
          sSql = sSql & "Where Dt_Cadastro >= '01-JAN-2000' "
                                               
          rec.CursorLocation = adUseClient
          rec.Open sSql, dbBanco, adOpenKeyset
                    
          If rec.RecordCount = 0 Then
             sMsg = "Nenhum Registro Encontrado!"
          Else
                        
             Arquivo.nArquivo = FreeFile
             Open Arquivo.sArquivo For Output As #Arquivo.nArquivo
             Arquivo.sRegistro = ""
             nQtdeRegistros = 0
             
             Arquivo.sRegistro = "000 - CABEÇALHO "
             
             Print #Arquivo.nArquivo, Arquivo.sRegistro
             
             Do While Not rec.EOF
                nQtdeRegistros = nQtdeRegistros + 1
                LblQtde.Caption = nQtdeRegistros
                LblQtde.Refresh
                                
                Arquivo.sRegistro = Right("" & "", 1)
                                                                                   
                sCNPJ = IIf(Not IsNull(rec!CNPJ), rec!CNPJ, "")
                sNOME = IIf(Not IsNull(rec!NOME), rec!NOME, "")
                
                Arquivo.sRegistro = Arquivo.sRegistro & sCNPJ & ";"
                Arquivo.sRegistro = Arquivo.sRegistro & sNOME & ";"
                
                Print #Arquivo.nArquivo, Arquivo.sRegistro
                        
                rec.MoveNext
             
             Loop
                        
             Close #Arquivo.nArquivo
             'rtb.FileName = Arquivo.sArquivo
                        
          End If
                    
       End If
    
    End If
    
    rec.Close
    Set rec = Nothing
       
Fim:
    
    If Err.Number <> 0 Then
        sMsg = Err.Number & "-" & Err.Description
    End If
    
    Exportar_Arquivo = (Trim(sMsg) = "")
        
End Function
                    Bem, estou sem o vb aqui no momento, porém, você pode declarar o seu recordset da seguinte forma (nçao mebro a posição exata do withevents):
Dim withevents rs as new adodb.recordset
aparecerá na combo de eventos (onkeypress, onresize..) alguns eventos relativos ao recordset.
um deles se não me engano é whileFetching, ou seja, euqnato esta preenchendo o recordset.
Tente ver se te ajuda, nunca usei para esta finalidade, mas não vejo outra forma.
Espero que te ajude.
                
            Dim withevents rs as new adodb.recordset
aparecerá na combo de eventos (onkeypress, onresize..) alguns eventos relativos ao recordset.
um deles se não me engano é whileFetching, ou seja, euqnato esta preenchendo o recordset.
Tente ver se te ajuda, nunca usei para esta finalidade, mas não vejo outra forma.
Espero que te ajude.
                    Qual é o banco?
                
            O banco que uso é ORACLE
                    MARCOSA,
NÃO DEU CERTO. é ASSIM MESMO?
Dim withevents rs as new adodb.recordset ????
                
            NÃO DEU CERTO. é ASSIM MESMO?
Dim withevents rs as new adodb.recordset ????
                    declare a variavel fora de qualquer funçao, ou seja, no ÃnÃcio do seu form da seguinte forma:
Private WithEvents rs As new adodb.recordset
ou
Private WithEvents rs As adodb.recordset
Não lembro exatamente e estou sem o vb aqui.
Assim quando você for na lista de objetos do form, irá aparecer rs, você irá seleciona-lo e ao lado irão aparecer os eventos que temos ligados ao rs, você escolhe o evento que desejar...
Ai você terá de ver qual evento irá se adequr melhor ao que você deseja.
Espero que te ajude....
Se estiver errado, desculpe é que estou sem vb, então nem tenho como validar o código.
                
            Private WithEvents rs As new adodb.recordset
ou
Private WithEvents rs As adodb.recordset
Não lembro exatamente e estou sem o vb aqui.
Assim quando você for na lista de objetos do form, irá aparecer rs, você irá seleciona-lo e ao lado irão aparecer os eventos que temos ligados ao rs, você escolhe o evento que desejar...
Ai você terá de ver qual evento irá se adequr melhor ao que você deseja.
Espero que te ajude....
Se estiver errado, desculpe é que estou sem vb, então nem tenho como validar o código.
                    Então pq não usa o cursor no servidor?
                
            
                    é, não tá funcionando. Tem algo errado. Vc pode ver pra mim e me mandar o código amanhã?
                
            
                    ELSVB,
Vi que no seu select vc filtra tudo que foi cadastrado após uma certa Data.
"Where Dt_Cadastro >= '01-JAN-2000'"
Este campo Dt_Cadastro está indexado?
Se não, crie o indÃce, isto pode agilizar uma consulta.
                
            Vi que no seu select vc filtra tudo que foi cadastrado após uma certa Data.
"Where Dt_Cadastro >= '01-JAN-2000'"
Este campo Dt_Cadastro está indexado?
Se não, crie o indÃce, isto pode agilizar uma consulta.
                    Se o seu banco eh ORACLE 
Muda a sua conexão
para MSDAORA
e rode a sua sql novamente
aqui no supermercado acessamos bases de dados com até 3 milhões de
registros e tinhamos um problema parecido pois utilizamos na maioria dos aplicativos
ORAOLEDB.ORACLE
porém nas telas onde temos necessidade de maior agilidade
mudamos a conexão para MSDAORA
espero ter ajudado
abçs
t+
                
            Muda a sua conexão
para MSDAORA
e rode a sua sql novamente
aqui no supermercado acessamos bases de dados com até 3 milhões de
registros e tinhamos um problema parecido pois utilizamos na maioria dos aplicativos
ORAOLEDB.ORACLE
porém nas telas onde temos necessidade de maior agilidade
mudamos a conexão para MSDAORA
espero ter ajudado
abçs
t+
                    MarceloHF
esse campo já é indice!
                
            esse campo já é indice!
                        Tópico encerrado , respostas não são mais permitidas